{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:36.955915Z",
     "start_time": "2025-01-16T10:32:32.237113Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "\n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 1.26.4\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.0\n",
      "torch 2.5.1+cpu\n",
      "cpu\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 数据准备1：为了看灰度图片",
   "id": "f564e940f3732517"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:39.207991Z",
     "start_time": "2025-01-16T10:32:36.956921Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "from torchvision import transforms\n",
    "\n",
    "# 定义数据集的变换\n",
    "transform = transforms.Compose([\n",
    "    # transforms.ToTensor(),  # 转换为tensor，进行归一化\n",
    "])\n",
    "\n",
    "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n"
   ],
   "id": "3c39231dec59c63c",
   "outputs": [],
   "execution_count": 2
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:39.215146Z",
     "start_time": "2025-01-16T10:32:39.208993Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 通过id取数据，取到的是一个元祖,是第一个样本,在训练时，把特征和标签分开\n",
    "img, label = train_ds[0]\n",
    "\n",
    "print(type(img))  # <class 'PIL.Image.Image'>\n",
    "print(\"-\" * 50)\n",
    "\n",
    "print(label)"
   ],
   "id": "264b034080e0db48",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'PIL.Image.Image'>\n",
      "--------------------------------------------------\n",
      "9\n"
     ]
    }
   ],
   "execution_count": 3
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:39.240474Z",
     "start_time": "2025-01-16T10:32:39.216148Z"
    }
   },
   "cell_type": "code",
   "source": "img",
   "id": "134b5b06f343f22a",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<PIL.Image.Image image mode=L size=28x28>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACS0lEQVR4AWKgA2BkYOD1ZGBgZAHZxcjIAKZBbBBm+quS8v3rj1N/GBiZGP8wMKNIMv91cnnCzuU65+X/vww8/76hSP5iMFVgZtpp2HXm8nUz02PHGUHGQTHjf9cugd//GE7f+cUo8ft0yDSEJCMDw/8TCgyMf34x/Ph3/vYfT0VphLH/GRgY3kt+Z2fl+cH5z8aSSWwHqmsZuJiZvn18p/CPkYnr7z9ZBiaofQwMjMwMPFI/frH++sr/j537K9sldhOE5H9mhnBJJg4Gbtlf7L//cQhvusaCkGT5xXDlBxsXl6rSD2Yunr9PoraeYAGZx8T4+x/DHwaGbV+/s/1/zczxm+H3P2a9jwxMDMz///z6+Y+BwW7ime9v//z78/XrXw6GbwxsX4NAYc3AICSlJhmk/oPpN+czVjbhX1zHeOz+fWR9qcnIYNkkKvCX+cMfrl+M36+HneEVVGC4x/v5GycPHxcj83GpP3+/MTB/Z2DgF0lwy3z24/49VeFfrLxsf+UBY0xqv8vDw87Ayv/4mSiTRACHIrexMdMvJjYGRlYLlpeP+X485mHje/eQ5/uPP+svKwj9+vD77y/Wf4xsaixP/z/mFvnw5jULOysHL9Mbza+P37O/+f3nN6fERwOWC+sTn937wcPGwcb88+//by/+/WX5wfPrw4fffxRfMjIweBWLv/7wl5mNhZnxPysrGysjA+NLBrZ/EpfCGJn+MTA4tYnxMzGz/GV8+f/pvy/MDP9/f2Paff0YJBAYGBg0RN/LPPx1Fx5HFDIAaCTYdiCc4RIAAAAASUVORK5CYII=",
      "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAcABwBAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+tbw1oNx4m8QWmkWx2yXD4LkZCADJJ+gFbviL4a63oc7COE3MW4hdn38duD976jNc9daDqllIsc9lKrMu4YGeMkdR7gj8KzcV7H8BtEvV16+1iWCeG1Wz8mOV02pIzupwCeuAp6Z98cZ90aIzLIlw0c0ZJ4KgjHoeOa+evjS9n/wnMcNxBPCYLKONFhA2FNzMpGenDcgd816V4K03wefC+m3NlpVhP+5QSXBiR5fMx825iMg5zwce3FdbOzTwgW90lu6uCm8eYrL02soIyCPQgggEdMGQ3cluiPNK0rJwrRQBNueuMkt+teNfGKxsdY8WWdxNqcNo66eieXMwVsb5DnH415Hp2rajpE5n02/urOUjBe3laMkehIPIrVm8eeLrhNknibVivoLtx/I1UPinxC3XXtUP1vJP8ay5JZJpGkldnduSzHJP41//2Q=="
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:39.247391Z",
     "start_time": "2025-01-16T10:32:39.242476Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 显示图片，这里需要把transforms.ToTensor(),进行归一化注释掉，否则是不行的\n",
    "def show_image_content(img):\n",
    "    print(\"图像大小:\")\n",
    "    print(img.size)\n",
    "    print(\"-\" * 50)\n",
    "\n",
    "    print(\"图像模式:\")\n",
    "    print(img.mode)\n",
    "    print(\"-\" * 50)\n",
    "\n",
    "    # 如果图像是单通道的，比如灰度图，你可以这样获取像素值列表：\n",
    "    if img.mode == \"L\":\n",
    "        pixel_values = list(img.getdata())\n",
    "        print(\"像素值列表:\")\n",
    "        print(pixel_values)\n",
    "\n",
    "\n",
    "show_image_content(img)"
   ],
   "id": "e097526ea31d932d",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "图像大小:\n",
      "(28, 28)\n",
      "--------------------------------------------------\n",
      "图像模式:\n",
      "L\n",
      "--------------------------------------------------\n",
      "像素值列表:\n",
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 73, 0, 0, 1, 4, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 36, 136, 127, 62, 54, 0, 0, 0, 1, 3, 4, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 102, 204, 176, 134, 144, 123, 23, 0, 0, 0, 0, 12, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 236, 207, 178, 107, 156, 161, 109, 64, 23, 77, 130, 72, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 69, 207, 223, 218, 216, 216, 163, 127, 121, 122, 146, 141, 88, 172, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 200, 232, 232, 233, 229, 223, 223, 215, 213, 164, 127, 123, 196, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 225, 216, 223, 228, 235, 227, 224, 222, 224, 221, 223, 245, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 228, 218, 213, 198, 180, 212, 210, 211, 213, 223, 220, 243, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 12, 219, 220, 212, 218, 192, 169, 227, 208, 218, 224, 212, 226, 197, 209, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 99, 244, 222, 220, 218, 203, 198, 221, 215, 213, 222, 220, 245, 119, 167, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 55, 236, 228, 230, 228, 240, 232, 213, 218, 223, 234, 217, 217, 209, 92, 0, 0, 0, 1, 4, 6, 7, 2, 0, 0, 0, 0, 0, 237, 226, 217, 223, 222, 219, 222, 221, 216, 223, 229, 215, 218, 255, 77, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 62, 145, 204, 228, 207, 213, 221, 218, 208, 211, 218, 224, 223, 219, 215, 224, 244, 159, 0, 0, 0, 0, 0, 18, 44, 82, 107, 189, 228, 220, 222, 217, 226, 200, 205, 211, 230, 224, 234, 176, 188, 250, 248, 233, 238, 215, 0, 0, 57, 187, 208, 224, 221, 224, 208, 204, 214, 208, 209, 200, 159, 245, 193, 206, 223, 255, 255, 221, 234, 221, 211, 220, 232, 246, 0, 3, 202, 228, 224, 221, 211, 211, 214, 205, 205, 205, 220, 240, 80, 150, 255, 229, 221, 188, 154, 191, 210, 204, 209, 222, 228, 225, 0, 98, 233, 198, 210, 222, 229, 229, 234, 249, 220, 194, 215, 217, 241, 65, 73, 106, 117, 168, 219, 221, 215, 217, 223, 223, 224, 229, 29, 75, 204, 212, 204, 193, 205, 211, 225, 216, 185, 197, 206, 198, 213, 240, 195, 227, 245, 239, 223, 218, 212, 209, 222, 220, 221, 230, 67, 48, 203, 183, 194, 213, 197, 185, 190, 194, 192, 202, 214, 219, 221, 220, 236, 225, 216, 199, 206, 186, 181, 177, 172, 181, 205, 206, 115, 0, 122, 219, 193, 179, 171, 183, 196, 204, 210, 213, 207, 211, 210, 200, 196, 194, 191, 195, 191, 198, 192, 176, 156, 167, 177, 210, 92, 0, 0, 74, 189, 212, 191, 175, 172, 175, 181, 185, 188, 189, 188, 193, 198, 204, 209, 210, 210, 211, 188, 188, 194, 192, 216, 170, 0, 2, 0, 0, 0, 66, 200, 222, 237, 239, 242, 246, 243, 244, 221, 220, 193, 191, 179, 182, 182, 181, 176, 166, 168, 99, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 61, 44, 72, 41, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n"
     ]
    }
   ],
   "execution_count": 5
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:39.389645Z",
     "start_time": "2025-01-16T10:32:39.248392Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 这个代码必须是注释了上面的 transforms.ToTensor()才能够运行的\n",
    "def show_image_image(img_arr):\n",
    "    # cmaps=\"binary\" 使用 binary 颜色映射（即黑白颜色)\n",
    "    plt.imshow(img_arr, cmap=\"binary\")\n",
    "    plt.colorbar()  # 显示颜色条\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "show_image_image(img)"
   ],
   "id": "74067ae506e044a1",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 6
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 数据准备2：为训练做准备",
   "id": "7880f26e340cc0b"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:39.455999Z",
     "start_time": "2025-01-16T10:32:39.391651Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "from torchvision import transforms\n",
    "\n",
    "# 定义数据集的变换\n",
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(),  # 转换为tensor，进行归一化\n",
    "])\n",
    "\n",
    "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
   ],
   "id": "bb2f722e9b8df6b0",
   "outputs": [],
   "execution_count": 7
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:39.465473Z",
     "start_time": "2025-01-16T10:32:39.457002Z"
    }
   },
   "cell_type": "code",
   "source": [
    "print(type(train_ds))  # <class 'torchvision.datasets.mnist.FashionMNIST'>\n",
    "print(\"-\" * 50)\n",
    "\n",
    "print(len(train_ds))  # 60000\n",
    "print(\"-\" * 50)\n",
    "\n",
    "print(type(train_ds[0]))  # <class 'tuple'>\n",
    "print(\"-\" * 50)\n",
    "\n",
    "print(type(test_ds))  # <class 'torchvision.datasets.mnist.FashionMNIST'>\n",
    "print(\"-\" * 50)\n",
    "\n",
    "print(len(test_ds))  # 10000\n",
    "print(\"-\" * 50)\n",
    "\n",
    "print(type(test_ds[0]))  # <class 'tuple'>"
   ],
   "id": "3bd61a32b6ca1ae8",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'torchvision.datasets.mnist.FashionMNIST'>\n",
      "--------------------------------------------------\n",
      "60000\n",
      "--------------------------------------------------\n",
      "<class 'tuple'>\n",
      "--------------------------------------------------\n",
      "<class 'torchvision.datasets.mnist.FashionMNIST'>\n",
      "--------------------------------------------------\n",
      "10000\n",
      "--------------------------------------------------\n",
      "<class 'tuple'>\n"
     ]
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:39.472695Z",
     "start_time": "2025-01-16T10:32:39.466476Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 通过id取数据，取到的是一个元祖,是第一个样本,在训练时，把特征和标签分开\n",
    "img, label = train_ds[0]\n",
    "\n",
    "print(img.shape)  # torch.Size([1, 28, 28]) 这是因为通道数在最前面，因为是灰度图，所以只有一个通道\n",
    "print(\"-\" * 50)\n",
    "\n",
    "print(type(img))  # <class 'torch.Tensor'> tensor中文是 张量,和numpy的ndarray类似\n",
    "print(\"-\" * 50)\n",
    "\n",
    "# print(label.shape)\n",
    "# print(\"-\"*50)\n",
    "\n",
    "print(type(label))  # <class 'int'>\n",
    "print(\"-\" * 50)\n"
   ],
   "id": "548576c6e405f567",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([1, 28, 28])\n",
      "--------------------------------------------------\n",
      "<class 'torch.Tensor'>\n",
      "--------------------------------------------------\n",
      "<class 'int'>\n",
      "--------------------------------------------------\n"
     ]
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:39.485905Z",
     "start_time": "2025-01-16T10:32:39.473702Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 因为转换为tensor，自动进行归一化，所以像素值在0-1之间\n",
    "img[0]"
   ],
   "id": "fb54bd4697d7be9d",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.0000, 0.0510, 0.2863, 0.0000,\n",
       "         0.0000, 0.0039, 0.0157, 0.0000, 0.0000, 0.0000, 0.0000, 0.0039, 0.0039,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0118, 0.0000, 0.1412, 0.5333, 0.4980, 0.2431,\n",
       "         0.2118, 0.0000, 0.0000, 0.0000, 0.0039, 0.0118, 0.0157, 0.0000, 0.0000,\n",
       "         0.0118],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0235, 0.0000, 0.4000, 0.8000, 0.6902, 0.5255,\n",
       "         0.5647, 0.4824, 0.0902, 0.0000, 0.0000, 0.0000, 0.0000, 0.0471, 0.0392,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6078, 0.9255, 0.8118, 0.6980,\n",
       "         0.4196, 0.6118, 0.6314, 0.4275, 0.2510, 0.0902, 0.3020, 0.5098, 0.2824,\n",
       "         0.0588],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0039, 0.0000, 0.2706, 0.8118, 0.8745, 0.8549, 0.8471,\n",
       "         0.8471, 0.6392, 0.4980, 0.4745, 0.4784, 0.5725, 0.5529, 0.3451, 0.6745,\n",
       "         0.2588],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0039, 0.0039, 0.0039, 0.0000, 0.7843, 0.9098, 0.9098, 0.9137, 0.8980,\n",
       "         0.8745, 0.8745, 0.8431, 0.8353, 0.6431, 0.4980, 0.4824, 0.7686, 0.8980,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.7176, 0.8824, 0.8471, 0.8745, 0.8941,\n",
       "         0.9216, 0.8902, 0.8784, 0.8706, 0.8784, 0.8667, 0.8745, 0.9608, 0.6784,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.7569, 0.8941, 0.8549, 0.8353, 0.7765,\n",
       "         0.7059, 0.8314, 0.8235, 0.8275, 0.8353, 0.8745, 0.8627, 0.9529, 0.7922,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0039, 0.0118, 0.0000, 0.0471, 0.8588, 0.8627, 0.8314, 0.8549, 0.7529,\n",
       "         0.6627, 0.8902, 0.8157, 0.8549, 0.8784, 0.8314, 0.8863, 0.7725, 0.8196,\n",
       "         0.2039],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0235, 0.0000, 0.3882, 0.9569, 0.8706, 0.8627, 0.8549, 0.7961,\n",
       "         0.7765, 0.8667, 0.8431, 0.8353, 0.8706, 0.8627, 0.9608, 0.4667, 0.6549,\n",
       "         0.2196],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0157, 0.0000, 0.0000, 0.2157, 0.9255, 0.8941, 0.9020, 0.8941, 0.9412,\n",
       "         0.9098, 0.8353, 0.8549, 0.8745, 0.9176, 0.8510, 0.8510, 0.8196, 0.3608,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0039, 0.0157, 0.0235, 0.0275, 0.0078, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.9294, 0.8863, 0.8510, 0.8745, 0.8706, 0.8588,\n",
       "         0.8706, 0.8667, 0.8471, 0.8745, 0.8980, 0.8431, 0.8549, 1.0000, 0.3020,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0118, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.2431, 0.5686, 0.8000, 0.8941, 0.8118, 0.8353, 0.8667, 0.8549, 0.8157,\n",
       "         0.8275, 0.8549, 0.8784, 0.8745, 0.8588, 0.8431, 0.8784, 0.9569, 0.6235,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0706, 0.1725, 0.3216, 0.4196, 0.7412,\n",
       "         0.8941, 0.8627, 0.8706, 0.8510, 0.8863, 0.7843, 0.8039, 0.8275, 0.9020,\n",
       "         0.8784, 0.9176, 0.6902, 0.7373, 0.9804, 0.9725, 0.9137, 0.9333, 0.8431,\n",
       "         0.0000],\n",
       "        [0.0000, 0.2235, 0.7333, 0.8157, 0.8784, 0.8667, 0.8784, 0.8157, 0.8000,\n",
       "         0.8392, 0.8157, 0.8196, 0.7843, 0.6235, 0.9608, 0.7569, 0.8078, 0.8745,\n",
       "         1.0000, 1.0000, 0.8667, 0.9176, 0.8667, 0.8275, 0.8627, 0.9098, 0.9647,\n",
       "         0.0000],\n",
       "        [0.0118, 0.7922, 0.8941, 0.8784, 0.8667, 0.8275, 0.8275, 0.8392, 0.8039,\n",
       "         0.8039, 0.8039, 0.8627, 0.9412, 0.3137, 0.5882, 1.0000, 0.8980, 0.8667,\n",
       "         0.7373, 0.6039, 0.7490, 0.8235, 0.8000, 0.8196, 0.8706, 0.8941, 0.8824,\n",
       "         0.0000],\n",
       "        [0.3843, 0.9137, 0.7765, 0.8235, 0.8706, 0.8980, 0.8980, 0.9176, 0.9765,\n",
       "         0.8627, 0.7608, 0.8431, 0.8510, 0.9451, 0.2549, 0.2863, 0.4157, 0.4588,\n",
       "         0.6588, 0.8588, 0.8667, 0.8431, 0.8510, 0.8745, 0.8745, 0.8784, 0.8980,\n",
       "         0.1137],\n",
       "        [0.2941, 0.8000, 0.8314, 0.8000, 0.7569, 0.8039, 0.8275, 0.8824, 0.8471,\n",
       "         0.7255, 0.7725, 0.8078, 0.7765, 0.8353, 0.9412, 0.7647, 0.8902, 0.9608,\n",
       "         0.9373, 0.8745, 0.8549, 0.8314, 0.8196, 0.8706, 0.8627, 0.8667, 0.9020,\n",
       "         0.2627],\n",
       "        [0.1882, 0.7961, 0.7176, 0.7608, 0.8353, 0.7725, 0.7255, 0.7451, 0.7608,\n",
       "         0.7529, 0.7922, 0.8392, 0.8588, 0.8667, 0.8627, 0.9255, 0.8824, 0.8471,\n",
       "         0.7804, 0.8078, 0.7294, 0.7098, 0.6941, 0.6745, 0.7098, 0.8039, 0.8078,\n",
       "         0.4510],\n",
       "        [0.0000, 0.4784, 0.8588, 0.7569, 0.7020, 0.6706, 0.7176, 0.7686, 0.8000,\n",
       "         0.8235, 0.8353, 0.8118, 0.8275, 0.8235, 0.7843, 0.7686, 0.7608, 0.7490,\n",
       "         0.7647, 0.7490, 0.7765, 0.7529, 0.6902, 0.6118, 0.6549, 0.6941, 0.8235,\n",
       "         0.3608],\n",
       "        [0.0000, 0.0000, 0.2902, 0.7412, 0.8314, 0.7490, 0.6863, 0.6745, 0.6863,\n",
       "         0.7098, 0.7255, 0.7373, 0.7412, 0.7373, 0.7569, 0.7765, 0.8000, 0.8196,\n",
       "         0.8235, 0.8235, 0.8275, 0.7373, 0.7373, 0.7608, 0.7529, 0.8471, 0.6667,\n",
       "         0.0000],\n",
       "        [0.0078, 0.0000, 0.0000, 0.0000, 0.2588, 0.7843, 0.8706, 0.9294, 0.9373,\n",
       "         0.9490, 0.9647, 0.9529, 0.9569, 0.8667, 0.8627, 0.7569, 0.7490, 0.7020,\n",
       "         0.7137, 0.7137, 0.7098, 0.6902, 0.6510, 0.6588, 0.3882, 0.2275, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1569, 0.2392,\n",
       "         0.1725, 0.2824, 0.1608, 0.1373, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000]])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 10
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:46.523008Z",
     "start_time": "2025-01-16T10:32:39.486910Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def cal_mean_std(ds):\n",
    "    mean = 0.\n",
    "    std = 0.\n",
    "    # 遍历每张图片,img.shape=[1,28,28]\n",
    "    for img, _ in ds:\n",
    "        # 计算每张图片的均值，dim=(1, 2)表示计算每张图片的每一个像素的均值,行列共同求均值\n",
    "        mean += img.mean(dim=(1, 2))\n",
    "        std += img.std(dim=(1, 2))\n",
    "    mean /= len(ds)\n",
    "    std /= len(ds)\n",
    "    return mean, std\n",
    "\n",
    "\n",
    "print(cal_mean_std(train_ds))"
   ],
   "id": "cd281e628dba323f",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(tensor([0.2860]), tensor([0.3205]))\n"
     ]
    }
   ],
   "execution_count": 11
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:46.839646Z",
     "start_time": "2025-01-16T10:32:46.524028Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def show_imgs(n_rows, n_cols, train_ds, class_names):\n",
    "    assert n_rows * n_cols < len(train_ds)  # 确保打印的图片小于总样本数\n",
    "    plt.figure(figsize=(n_cols * 1.4, n_rows * 1.6))  # 宽1.4高1.6，宽，高\n",
    "    for row in range(n_rows):\n",
    "        for col in range(n_cols):\n",
    "            index = n_cols * row + col  # 计算索引，从0开始\n",
    "            # subplot 用于在一个图中创建多个子图（subplots）\n",
    "            # 因为 plt.subplot 的参数是从 1 开始 的，而不是从 0 开始。\n",
    "            plt.subplot(n_rows, n_cols, index + 1)\n",
    "            img_arr, label = train_ds[index]\n",
    "\n",
    "            # 图像数据通常有两种常见的存储格式：\n",
    "            # 通道优先（Channels First）：形状为 (C, H, W)。\n",
    "            #     例如，PyTorch 和某些深度学习框架默认使用这种格式。\n",
    "            # 通道最后（Channels Last）：形状为 (H, W, C)。\n",
    "            #     例如，Matplotlib、OpenCV 和 TensorFlow 默认使用这种格式。            \n",
    "            # 这里我们使用通道优先的格式，所以需要转置一下\n",
    "            # 可以将通道维度从第 0 维移动到第 2 维，这样 Matplotlib 就能正确显示图像。\n",
    "            img_arr = np.transpose(img_arr, (1, 2, 0))\n",
    "            # interpolation='nearest' 用于调整图像的插值方式，'nearest'表示采用最近邻插值法\n",
    "            plt.imshow(img_arr, cmap=\"binary\", interpolation='nearest')\n",
    "            plt.axis(\"off\")  # 关闭坐标轴\n",
    "            plt.title(class_names[label])  # 显示标签\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "#0-9分别代表的类别\n",
    "class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',\n",
    "               'Coat', 'Sandal', 'Shirt', 'Sneaker',\n",
    "               'Bag', 'Ankle boot']\n",
    "# 打印了前15个样本\n",
    "show_imgs(3, 5, train_ds, class_names)"
   ],
   "id": "8cb72aaed1c5ffae",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 700x480 with 15 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAGMCAYAAADA5EjBAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAb4tJREFUeJztnQe41FS3hoPSe++9SRekIwqCiDQFRRFFQBRRUcGG/Cr2hogoImDFgvyi0hEFFJCuFKnSm/TeBFGQuc/KvZP7ZZ3sMOdwymTme5/nwJ7Jnkxmt+ysmi4UCoUsQgghhJAAcklaXwAhhBBCSFLhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGDhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGCJqo1M9+7drezZs1+wXtOmTe2/5ELOVa1atWQ7H0ketm/fbqVLl8568803L1j3+eeft+uS6IH9R0jasj1O5uBFb2SGDx9u//j69esnzxXFGa+++qo1ceJEK4hIv0fyN2fOHCuaOH36tD1po+26Uhv2X+zx6aefuvouc+bMVtGiRa2WLVtaQ4cOtU6ePJnWl0gAzsHkIf3FnuDLL7+0Spcubf3666/W5s2brfLlyyfPlcXRRqZjx45W+/btraDxxRdfuF5//vnn1syZMxO8X7ly5RS/lmeeecbq379/xJPwhRdesMvJKdkLGuy/2OXFF1+0ypQpY509e9bat2+ffcPp27ev9dZbb1mTJ0+2atSokdaXSDgHo2Mjs23bNmvhwoXW+PHjrV69etmbmueeey75ro5ENV26dHG9Xrx4sT0J9fupQfr06e0/P86fP2/9888/qXZN0Q77L3Zp1aqVVadOHef1f/7zH2vWrFlW27ZtrRtuuMFat26dlSVLFs/Pnjp1ysqWLVsqXm38wjkYBaol2bjkyZPHatOmjS1VkNd+OroPPvjAKleunJUpUyarbt261pIlSy74HStWrLAKFChg7/r+/PNPY72///7b3kSJREjOX6JECatfv372+5GybNkyq1GjRvYEl6eZkSNHJqhz4MAB6+6777YKFSpki20vv/xy67PPPvNcDB577DH7OuR6LrvsMrsNMNm4tIvUk8+HRYhiJxQvLF261BZ558+f32nzHj16eNa90Njx0u/K6wcffNAel1WrVrU/K30q40mQJ4pwu8vnSeJg/wWLZs2aWQMGDLB27NhhjR492mWXuGXLFqt169ZWjhw5rDvuuMO5ab399tt228taJ2uePLAePXo00ePgq6++smrXrm2fP2fOnFb16tWtd955JxV/fWzCOZgMEhn5cTfddJOVMWNGq3PnztaIESPsxpFG0owZM8bWz8pEkB/9xhtv2J/dunWrlSFDBs/zy7mkk+TJYtKkScYnCJlw8pQxf/58695777XFcKtXr7aGDBlibdy4MSIbFJmcMpFvvfVW+7d8/fXX1v3332//tvDA+Ouvv+wNlajQpHNl0HzzzTf2YnDs2DGrT58+dj3ZrMj1zJ4929701KxZ05o+fbr1xBNPWLt377avSxDx4T333GPVq1fPvm5BBlo8IBvC6667zp4QIs7MnTu3vekV6V5yjJ0w8hQqfSn9JZNdNp4yTqVvO3ToYJ9HoKg9cbD/gsmdd95pPfXUU9aMGTOsnj172u+dO3fOXmcbN25sP2xlzZrVfl/6S2xu7rrrLuvhhx+2JfDDhg2zfvvtN2vBggV230UyDkTCIGtq8+bNrYEDB9rviURIzhFeM0ni4RwEQklk6dKlIloIzZw50359/vz5UPHixUN9+vRx1du2bZtdL1++fKEjR44470+aNMl+f8qUKc573bp1C2XLls0uz58/P5QzZ85QmzZtQmfOnHGds0mTJvZfmC+++CJ0ySWXhObNm+eqN3LkSPs7FixY4Ptb5FxSb/Dgwc57f//9d6hmzZqhggULhv755x/7vbffftuuN3r0aKeeHGvYsGEoe/bsoRMnTtjvTZw40a738ssvu76nY8eOoXTp0oU2b97svCe/V353LNC7d2/7d0fChAkT7LpLliwx1knM2HnuuecSfLe8lnGxdu1a1/sHDx60j8lnyP/D/gs+o0aNumC/5MqVK1SrVi27LGuP1O/fv7+rjqyl8v6XX37pev+HH35wvR/JOJB7gqzl586du8hfF/twDiaNSy5GGiOixmuuucZ+Lbu8Tp062SLEf//9N0F9OSZqqDBXXXWV/b/sCDUiyZAnBNnBy+5SxFl+iFREpDCVKlWyDh065PyJKDV8vgshukHZrYYRSYy8ll2vqJyEadOmWYULF7afLsLIblaeVkTt9fPPPzv1Lr30Uvt9RFRNMja+//57K96Rpwdh6tSptkGiH4kZO5omTZpYVapU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YOFGhhBCCCGBhRsZQgghhASWmN7IbN++3UqXLp315ptvXrDu888/b9clF0f37t2t7NmzX7Be06ZN7b/kQs5VrVq1ZDsfSV0+/fRTe/7JnE3KmCtdunSKXBeJDPZffNwno5U03chI40XyN2fOHCuaOH36tL3xibbrSirDhw+327l+/fppfSmB5NVXX7UmTpxoBY3Vq1dbHTt2tEqVKmVlzpzZKlasmNWiRQvr3XffTetLIxHA/gsO7KuUJb2VhnzxxReu159//rk1c+bMBO9Xrlw5xa/lmWeesfr37x/xRuaFF16wy8kpVUgrvvzyS/uJ6Ndff7U2b95slS9fPq0vKXAbGVmk2rdvbwWFhQsXWtdcc41VsmRJq2fPnlbhwoWtnTt3WosXL7beeecd66GHHkrrSyQ+sP+CA/sqxjcyXbp0cb2WjpWNjH4/NUifPr3958f58+etf/75x4oltm3bZk+08ePHW7169bI3Nc8991xaXxZJYV555RUrV65c1pIlS6zcuXO7jh04cCDNrotEBvsvOLCvLPvhP2vWrCl2/kDbyCxdutRq2bKllT9/fitLlixWmTJlrB49enjW/eCDD6xy5cpZmTJlsurWrWsPqgvZyMjrBx980L65V61a1f7syJEjrQIFCtjHRSoTVn/J54OI/LY8efJYbdq0saUK8tpPh3qhdvRixYoVdpuJ9OrPP/801vv777/tTZRIhOT8JUqUsPr162e/HynLli2zGjVq5IwH6S+NLB533323VahQIVvMe/nll1ufffZZgnqnTp2yHnvsMfs65Houu+wyuw1CoZBTR9pF6snnw2NBdP7RzpYtW+wxrRdWoWDBgk551KhRVrNmzez3pA2qVKlijRgxIsFnRKLXtm1ba/78+Va9evXsdi1btqwtZdWsXbvWPqf0UfHixa2XX37ZfkjQTJo0yR6XRYsWtb9bxt1LL71k/fvvv1a8w/6Lvb4K329ETS32ftJm8rkffvghwed2795t3+tkDcv0f/U++eQTVx156H722Wet2rVr2xupbNmyWVdddZU1e/bsC16zrHH33nuvlTFjRvshN8zo0aPt80nf582b17rtttts6ZKXvaKsxVdffbW9gXnqqaesmJXIXAxyM7ruuuvsG6SohGSQyA0XGz3MmDFjrJMnT9oSBxksb7zxhnXTTTdZW7dutTJkyOD7PbNm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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 12
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:46.845437Z",
     "start_time": "2025-01-16T10:32:46.840667Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# torch.utils.data.DataLoader 是 PyTorch 中用于加载数据的一个重要工具。它可以将数据集包装成一个可迭代的对象，支持批量加载、多线程加载、数据打乱等功能，非常适合在训练深度学习模型时使用。\n",
    "\n",
    "# DataLoader 的主要功能包括：\n",
    "# (1)批量加载数据：将数据集分成多个批次（batches），方便模型训练。\n",
    "# (2)多线程加载：通过多线程加速数据加载。\n",
    "# (3)数据打乱：在每个 epoch 开始时打乱数据，避免模型过拟合。\n",
    "# (4)自定义数据加载逻辑：支持通过 Dataset 类自定义数据加载方式。\n",
    "\n",
    "# DataLoader 的常用参数包括：\n",
    "# dataset：要加载的数据集，必须是 torch.utils.data.Dataset 的子类。\n",
    "# batch_size：每批加载的样本数。\n",
    "#   batch_size 过小：训练速度慢，梯度更新不稳定，噪声较多，但内存占用低。\n",
    "#   batch_size 过大：内存占用高，梯度更新平滑，泛化性能可能下降。\n",
    "# shuffle：是否在每个 epoch 开始时打乱数据。\n",
    "# num_workers：用于数据加载的线程数。\n",
    "# drop_last：如果数据集大小不能被 batch_size 整除，是否丢弃最后一个不完整的批次。\n",
    "# pin_memory：是否将数据加载到 CUDA 的固定内存中，可以加速 GPU 数据传输。\n",
    "\n",
    "# 从数据集到dataloader\n",
    "# batch_size分批，shuffle洗牌\n",
    "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True)\n",
    "\n",
    "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=True)"
   ],
   "id": "12d60c03f14047e5",
   "outputs": [],
   "execution_count": 13
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:46.863389Z",
     "start_time": "2025-01-16T10:32:46.847450Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 维度信息\n",
    "# data的shape是[batch_size,通道数,高,宽]\n",
    "# label的shape是[batch_size]\n",
    "for data, label in train_loader:\n",
    "    print(data.shape)  # torch.Size([32, 1, 28, 28])\n",
    "    print(label.shape)  # torch.Size([32])\n",
    "    break\n",
    "\n",
    "for data, label in val_loader:\n",
    "    print(data.shape)  # torch.Size([32, 1, 28, 28])\n",
    "    print(label.shape)  # torch.Size([32])\n",
    "    break\n",
    "\n"
   ],
   "id": "1bce5aecf16db014",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n"
     ]
    }
   ],
   "execution_count": 14
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 定义模型",
   "id": "48757a508522b016"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:46.874656Z",
     "start_time": "2025-01-16T10:32:46.864394Z"
    }
   },
   "cell_type": "code",
   "source": [
    "class NeuralNetwork(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__()  # 继承父类的初始化方法，子类有父类的属性\n",
    "        self.flatten = nn.Flatten()  # 展平层\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            # in_features=784, out_features=300, 784是输入特征数，300是输出特征数\n",
    "            nn.Linear(28 * 28, 300),\n",
    "            nn.ReLU(),  # 激活函数\n",
    "            nn.Linear(300, 100),  # 隐藏层神经元数100\n",
    "            nn.ReLU(),  # 激活函数\n",
    "            nn.Linear(100, 10),  #输出层神经元数10，对应10个类别\n",
    "        )\n",
    "\n",
    "    def forward(self, x):  # 前向计算，前向传播\n",
    "        # x.shape [batch size, 1, 28, 28],1是通道数\n",
    "        x = self.flatten(x)  # 展平\n",
    "        # print(f\"x.shape {x.shape}\")\n",
    "        # 展平后 x.shape [batch size, 784]\n",
    "        logits = self.linear_relu_stack(x)  # 线性层\n",
    "        # logits.shape=[batch_size, 10]\n",
    "        # [batch size, 784] * [784,300]-> [bacth size, 300]\n",
    "        # [bacth size, 300] * [300,100] -> [bacth size, 100]\n",
    "        # [bacth size, 100] * [100,10] -> [bacth size, 10]\n",
    "        # 最后输出logits，没有经过softmax，称为logits\n",
    "        return logits\n",
    "\n",
    "\n",
    "model = NeuralNetwork()\n",
    "# 查看网络结构\n",
    "model"
   ],
   "id": "4a6a5fa13d27e3d6",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NeuralNetwork(\n",
       "  (flatten): Flatten(start_dim=1, end_dim=-1)\n",
       "  (linear_relu_stack): Sequential(\n",
       "    (0): Linear(in_features=784, out_features=300, bias=True)\n",
       "    (1): ReLU()\n",
       "    (2): Linear(in_features=300, out_features=100, bias=True)\n",
       "    (3): ReLU()\n",
       "    (4): Linear(in_features=100, out_features=10, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 15
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:46.882987Z",
     "start_time": "2025-01-16T10:32:46.875658Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 查看模型运算的tensor尺寸\n",
    "x = torch.randn(32, 1, 28, 28)\n",
    "print(x.shape)  # torch.Size([32, 1, 28, 28])\n",
    "logits = model(x)\n",
    "print(logits.shape)  # torch.Size([32, 10])"
   ],
   "id": "6209ac5ca75f953c",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32, 10])\n"
     ]
    }
   ],
   "execution_count": 16
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:46.888809Z",
     "start_time": "2025-01-16T10:32:46.883992Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# model.parameters()返回一个生成器，包含模型所有参数的迭代器\n",
    "for name, param in model.named_parameters():  # 打印模型参数\n",
    "    print(name, param.shape)"
   ],
   "id": "52b997cb8b802454",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear_relu_stack.0.weight torch.Size([300, 784])\n",
      "linear_relu_stack.0.bias torch.Size([300])\n",
      "linear_relu_stack.2.weight torch.Size([100, 300])\n",
      "linear_relu_stack.2.bias torch.Size([100])\n",
      "linear_relu_stack.4.weight torch.Size([10, 100])\n",
      "linear_relu_stack.4.bias torch.Size([10])\n"
     ]
    }
   ],
   "execution_count": 17
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:46.911045Z",
     "start_time": "2025-01-16T10:32:46.890811Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 看看模型参数\n",
    "# 这种方法拿到模型的所有可学习参数,requires_grad=True\n",
    "list(model.parameters())"
   ],
   "id": "a7ad9ba48742a289",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Parameter containing:\n",
       " tensor([[-0.0024,  0.0039, -0.0256,  ..., -0.0113,  0.0306, -0.0307],\n",
       "         [-0.0283, -0.0118,  0.0185,  ..., -0.0176, -0.0025, -0.0155],\n",
       "         [ 0.0067, -0.0172,  0.0018,  ...,  0.0123, -0.0064,  0.0030],\n",
       "         ...,\n",
       "         [ 0.0044, -0.0058, -0.0121,  ..., -0.0084, -0.0245,  0.0077],\n",
       "         [-0.0206, -0.0249,  0.0251,  ..., -0.0114, -0.0124,  0.0348],\n",
       "         [ 0.0111, -0.0091, -0.0024,  ..., -0.0225, -0.0167,  0.0113]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([ 1.9875e-02, -6.6696e-04, -5.2443e-03,  2.5638e-02,  1.9079e-02,\n",
       "         -3.1439e-02, -2.4610e-02, -2.3904e-02,  2.9628e-04,  2.3821e-02,\n",
       "         -2.7907e-02,  1.2569e-02,  2.0794e-02, -6.6438e-03,  2.5639e-02,\n",
       "         -4.6674e-03,  1.4385e-02, -1.3421e-02, -3.2704e-02, -1.7019e-02,\n",
       "          1.0740e-03, -2.3102e-02,  2.5535e-02, -2.8147e-03,  1.8362e-02,\n",
       "         -2.2675e-02, -4.6621e-03,  2.3830e-02, -5.6671e-03,  1.1140e-02,\n",
       "          9.8116e-03, -1.5775e-02,  1.8337e-02, -2.3321e-02,  1.3495e-03,\n",
       "         -5.1441e-03,  1.1328e-02,  2.3246e-02,  2.8589e-02,  5.7003e-03,\n",
       "         -3.0028e-02, -3.3075e-02, -1.7313e-02, -6.2710e-03, -2.9706e-02,\n",
       "          1.3227e-02, -1.9164e-02,  2.8192e-02, -2.5414e-02, -3.7987e-03,\n",
       "         -3.0067e-02, -3.3193e-02, -8.9452e-04, -1.1442e-02,  3.5358e-02,\n",
       "          5.2291e-03, -6.2903e-03,  9.3851e-03,  2.4711e-02, -1.3765e-02,\n",
       "         -1.8917e-03,  4.3956e-03, -1.2263e-02,  2.3031e-02, -8.5913e-03,\n",
       "         -2.2547e-02,  2.9417e-02,  2.8643e-02, -3.2315e-03,  2.0580e-02,\n",
       "         -1.7644e-02,  1.2033e-02,  1.3891e-02, -1.6222e-02,  1.8920e-03,\n",
       "          2.9771e-02, -8.8603e-03, -1.3060e-02, -2.8258e-03,  1.4714e-03,\n",
       "          1.3570e-02,  2.2649e-03,  5.3145e-03,  3.3827e-02, -8.2198e-03,\n",
       "          4.2723e-03,  3.0102e-02,  2.4971e-02,  3.3039e-02,  2.4644e-02,\n",
       "          1.6239e-02, -1.7823e-02, -2.1167e-02, -3.0683e-02,  3.2497e-02,\n",
       "          3.2253e-02, -3.2527e-02, -2.2622e-03, -8.7246e-03,  2.9866e-02,\n",
       "         -2.6282e-02,  2.6525e-02, -1.9724e-02,  9.2542e-03, -3.4036e-02,\n",
       "         -2.5564e-02, -9.1188e-03,  2.2909e-02, -3.0008e-02,  2.3701e-02,\n",
       "          3.1301e-02,  5.2145e-03,  2.9638e-02,  3.3931e-02, -3.5398e-02,\n",
       "          1.2209e-02,  2.4202e-02,  3.2659e-02, -4.8486e-04,  2.5483e-02,\n",
       "          1.3011e-02, -2.4683e-02,  1.6969e-02,  1.8167e-02,  3.3565e-02,\n",
       "          1.3166e-02, -3.1069e-02, -3.0980e-02, -1.4830e-02,  2.2218e-02,\n",
       "         -3.5110e-02, -4.2747e-03,  6.6847e-03,  2.6438e-02, -1.2563e-02,\n",
       "         -2.1958e-02,  2.5092e-02, -1.6350e-02,  2.0256e-03, -7.7691e-03,\n",
       "          1.4372e-02,  3.1046e-02,  1.4021e-02, -2.1740e-02, -1.6377e-02,\n",
       "          3.0277e-02, -3.5583e-02,  1.5937e-02,  3.1346e-02,  3.1502e-03,\n",
       "         -7.9609e-06, -3.0745e-02,  3.3292e-02,  1.7431e-02, -2.1263e-02,\n",
       "         -5.4227e-03, -1.7117e-02, -3.1386e-02, -3.5660e-02, -1.4865e-02,\n",
       "         -3.4761e-02,  2.6771e-02, -2.6032e-02,  1.9970e-02,  3.2288e-02,\n",
       "         -3.2910e-02, -7.7182e-03,  2.8409e-04,  1.5121e-02, -3.0240e-02,\n",
       "         -3.1047e-02, -6.5841e-03, -2.0434e-02,  2.7411e-03,  2.9809e-02,\n",
       "          3.3830e-02,  4.8876e-03, -1.8301e-02, -8.5898e-03,  2.7277e-02,\n",
       "          2.2846e-02,  7.8423e-03, -9.4400e-03, -2.6143e-02,  3.5008e-02,\n",
       "          7.9975e-03,  2.9871e-03,  1.3761e-02, -2.2129e-02,  3.0850e-02,\n",
       "          2.1901e-02,  1.8363e-02, -2.5461e-02,  2.7835e-02, -1.5553e-02,\n",
       "         -1.8984e-02,  1.3054e-02,  3.0118e-03,  3.4914e-02,  3.0457e-03,\n",
       "         -8.1079e-03,  3.1694e-02,  1.5371e-05, -9.8671e-04,  2.3795e-02,\n",
       "         -1.3926e-03, -1.3629e-02, -6.9625e-03,  1.3790e-03,  2.3210e-03,\n",
       "         -2.5013e-02,  3.1642e-02,  2.9930e-02, -1.4788e-02, -7.2329e-04,\n",
       "         -1.5523e-03,  2.0089e-02, -1.6250e-02, -2.9960e-02,  2.3806e-02,\n",
       "          3.1552e-02, -2.7450e-02, -1.2217e-02, -1.4694e-02, -2.8237e-02,\n",
       "          3.2695e-02,  1.4604e-02,  1.5834e-02,  1.5490e-02, -1.8917e-02,\n",
       "          6.4463e-03,  2.8438e-02,  2.2868e-02, -1.2392e-02,  2.1851e-02,\n",
       "         -7.9160e-03, -9.7653e-03,  3.1826e-02, -3.8498e-03, -1.6653e-02,\n",
       "         -1.9439e-02,  2.6776e-02, -3.4754e-02, -3.1225e-02, -3.1135e-02,\n",
       "          2.6349e-03,  1.9104e-02, -1.1496e-02, -1.8430e-02,  4.9534e-03,\n",
       "          1.7212e-02, -9.4613e-03,  1.5953e-02, -1.3976e-02,  1.6822e-02,\n",
       "         -3.5559e-03,  2.0416e-03,  5.7294e-03,  1.8272e-02, -2.2956e-02,\n",
       "          7.2431e-03, -3.0289e-02,  1.4625e-02, -2.9672e-02,  7.0183e-03,\n",
       "          1.2384e-02, -2.1376e-02,  2.3751e-02,  2.2385e-02, -1.8065e-02,\n",
       "          3.3278e-02,  2.3633e-02, -2.2089e-02,  3.3811e-02, -1.4982e-02,\n",
       "          1.0686e-02, -7.8752e-03,  3.0440e-02,  3.5954e-03, -2.0811e-02,\n",
       "          1.9512e-02, -1.8686e-02,  1.6332e-03, -8.6572e-03, -2.2144e-02,\n",
       "          2.5753e-02, -2.2917e-02,  2.7852e-02, -2.1711e-02,  3.2846e-02,\n",
       "         -1.2911e-02,  1.8596e-02, -2.5877e-02,  6.4921e-03,  8.4391e-03,\n",
       "          1.5852e-02, -3.3136e-02, -3.2809e-02,  1.3387e-02, -2.6325e-02],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[-0.0528, -0.0415, -0.0179,  ..., -0.0043,  0.0168, -0.0102],\n",
       "         [ 0.0503,  0.0385, -0.0367,  ..., -0.0271, -0.0368, -0.0123],\n",
       "         [-0.0404, -0.0052, -0.0041,  ...,  0.0127, -0.0390,  0.0427],\n",
       "         ...,\n",
       "         [-0.0057, -0.0374,  0.0397,  ...,  0.0246,  0.0299,  0.0246],\n",
       "         [ 0.0202, -0.0208,  0.0104,  ...,  0.0029,  0.0127, -0.0341],\n",
       "         [ 0.0242, -0.0131,  0.0418,  ...,  0.0202, -0.0146, -0.0105]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-0.0121, -0.0146,  0.0031,  0.0162,  0.0384,  0.0444, -0.0501,  0.0130,\n",
       "         -0.0083, -0.0325,  0.0242,  0.0513, -0.0331, -0.0250,  0.0148, -0.0377,\n",
       "          0.0451,  0.0119, -0.0481,  0.0435, -0.0390,  0.0339, -0.0262,  0.0342,\n",
       "          0.0317,  0.0532,  0.0188, -0.0497,  0.0167,  0.0552,  0.0214, -0.0028,\n",
       "          0.0074,  0.0195, -0.0204,  0.0349, -0.0575,  0.0275, -0.0002,  0.0484,\n",
       "         -0.0100,  0.0102, -0.0040,  0.0333,  0.0166,  0.0150,  0.0013,  0.0295,\n",
       "         -0.0302, -0.0328, -0.0379,  0.0454,  0.0310, -0.0533, -0.0056,  0.0496,\n",
       "          0.0010, -0.0308,  0.0036,  0.0208, -0.0224, -0.0267,  0.0310,  0.0574,\n",
       "         -0.0357, -0.0206, -0.0504,  0.0471, -0.0181,  0.0047,  0.0465,  0.0086,\n",
       "          0.0273, -0.0356,  0.0456,  0.0268,  0.0495, -0.0082, -0.0085,  0.0014,\n",
       "          0.0151, -0.0274,  0.0556, -0.0273,  0.0194,  0.0216, -0.0001, -0.0423,\n",
       "         -0.0264,  0.0406,  0.0506,  0.0458, -0.0173,  0.0281, -0.0347, -0.0171,\n",
       "          0.0506,  0.0492, -0.0474, -0.0347], requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[ 5.1743e-02, -4.9780e-02, -7.1040e-02,  1.9736e-02, -6.2711e-02,\n",
       "           9.7075e-02,  8.0924e-02, -2.1538e-02, -2.4706e-02,  9.5461e-02,\n",
       "          -6.2949e-02,  6.8254e-02, -1.0811e-02,  2.2331e-02, -4.9964e-03,\n",
       "           6.5010e-02,  6.8820e-02, -4.1799e-03,  8.4120e-02,  4.0545e-03,\n",
       "           5.0466e-02, -5.2328e-02,  3.3274e-02, -6.2731e-02, -6.7443e-02,\n",
       "          -2.8496e-02,  3.4487e-02, -4.4721e-02, -9.4944e-02, -2.2108e-03,\n",
       "           2.0808e-02,  4.5384e-02,  2.8984e-03,  2.1810e-02,  5.9559e-02,\n",
       "          -1.8083e-02,  7.6317e-02,  1.9121e-02,  3.4676e-02, -7.0017e-02,\n",
       "          -9.2158e-02,  5.2939e-02,  2.0365e-02,  9.9424e-03, -5.5875e-03,\n",
       "           3.1557e-02,  3.6414e-02,  2.3364e-02, -5.1877e-02, -6.3572e-02,\n",
       "           2.9117e-02,  3.5209e-02, -9.1565e-02,  9.1050e-02, -5.4053e-02,\n",
       "          -9.5595e-02,  6.3410e-02, -4.9341e-03, -6.5049e-02, -6.6551e-02,\n",
       "          -7.0233e-02,  4.0225e-02, -7.9489e-02, -8.3320e-02,  1.3763e-02,\n",
       "           4.1513e-02, -3.9745e-02,  2.2023e-02, -9.0284e-02,  4.1031e-02,\n",
       "           3.6729e-02,  8.0278e-02, -6.0227e-02,  6.3234e-02, -1.6743e-02,\n",
       "           7.2129e-02, -4.7343e-02,  7.9552e-02,  1.5267e-02,  5.3554e-02,\n",
       "           1.5457e-02, -5.1159e-02, -5.3154e-02, -1.1650e-02, -1.7196e-02,\n",
       "          -2.0905e-03, -3.0937e-02, -1.0722e-02, -5.0736e-02,  6.6200e-02,\n",
       "          -9.4866e-03,  3.4630e-04,  5.9285e-03, -6.3013e-02, -8.0516e-03,\n",
       "          -2.3768e-04, -8.1178e-02, -9.0670e-02,  1.5771e-02,  3.0648e-02],\n",
       "         [-6.8861e-02, -3.4344e-02, -9.9141e-02,  7.3014e-02,  1.9488e-02,\n",
       "           4.5951e-02, -1.6056e-02,  1.6238e-02, -6.9292e-02,  8.9956e-02,\n",
       "          -7.3915e-03,  4.8407e-02,  9.4873e-02, -8.6054e-03, -6.6756e-02,\n",
       "           6.6469e-02, -9.5727e-02, -7.3084e-03,  6.2767e-02,  2.6751e-02,\n",
       "           1.8586e-02, -9.2163e-02, -1.1608e-02,  6.7736e-02, -1.6494e-02,\n",
       "           6.6184e-02, -6.2247e-02,  5.4483e-02, -9.3713e-02,  9.3947e-02,\n",
       "          -5.0034e-03, -4.9296e-02,  5.4477e-02, -1.9943e-02, -1.2831e-02,\n",
       "           6.2209e-02,  6.2760e-02, -6.1803e-03,  2.7413e-02, -8.4660e-03,\n",
       "          -3.0472e-02, -3.8994e-02, -2.2559e-02,  5.7608e-02, -2.6109e-03,\n",
       "          -2.5332e-02, -7.4160e-02, -5.1407e-02, -3.2027e-02, -6.5622e-02,\n",
       "           4.4408e-02,  5.5548e-02,  2.7689e-02, -9.3438e-02,  4.2306e-02,\n",
       "          -9.8859e-02, -2.6122e-02, -9.2036e-02, -1.9155e-02, -7.9817e-02,\n",
       "          -8.5591e-02,  1.6578e-02,  5.3516e-02, -1.5218e-02, -8.0000e-02,\n",
       "           2.3734e-02, -6.5259e-02, -4.3336e-02, -4.0811e-02,  7.7600e-02,\n",
       "           4.7588e-02,  6.0539e-02,  7.7064e-02,  5.3046e-02, -2.4433e-02,\n",
       "           5.4799e-02, -9.1907e-02, -9.1287e-02, -3.3427e-02, -7.5734e-02,\n",
       "          -6.3183e-02, -3.3539e-02,  7.3012e-02, -3.0157e-02,  4.2333e-02,\n",
       "           8.6200e-02, -1.0520e-02, -4.5435e-02, -4.8708e-02,  4.0714e-02,\n",
       "           7.1894e-02, -6.6054e-02,  8.6006e-03, -9.4340e-02,  7.9538e-02,\n",
       "           3.9345e-02, -8.1585e-02, -8.6774e-02, -5.1209e-02,  4.0332e-02],\n",
       "         [-2.9870e-02, -8.2491e-02, -7.0332e-02,  1.1110e-02,  5.5587e-03,\n",
       "          -7.3379e-02, -2.3543e-02,  3.0987e-02, -3.3371e-02, -2.8579e-02,\n",
       "          -4.8104e-03, -2.2377e-02,  6.6542e-02, -6.2067e-02, -2.0652e-04,\n",
       "          -7.4597e-02,  1.0724e-02,  6.3749e-02, -1.2122e-02, -9.4010e-02,\n",
       "           8.8929e-02,  3.3755e-02, -5.9494e-02, -5.7044e-04,  5.4644e-02,\n",
       "          -6.0876e-02, -5.2292e-02, -3.7435e-03, -5.1406e-02,  1.7553e-03,\n",
       "           1.9244e-04, -6.1730e-02,  8.8512e-02, -3.6285e-02,  4.2899e-02,\n",
       "          -6.0907e-02, -6.3015e-02, -4.1228e-03, -8.0353e-02,  4.9177e-02,\n",
       "          -9.0046e-02,  9.5337e-02,  6.4535e-02,  1.5106e-02,  9.7611e-02,\n",
       "           5.1692e-02, -4.6907e-02, -4.6138e-02, -5.9827e-02, -7.6671e-02,\n",
       "           1.3475e-02,  9.6155e-02,  2.8002e-02, -3.7644e-02,  1.8279e-02,\n",
       "          -5.1641e-02,  8.3821e-02, -3.3266e-02,  9.2054e-02,  4.2005e-02,\n",
       "          -7.5743e-02,  3.4445e-02, -1.9265e-02, -5.0016e-02,  5.4765e-03,\n",
       "           7.8959e-02,  2.9193e-02, -1.0386e-02,  5.2361e-02,  6.2712e-02,\n",
       "           3.3951e-02, -6.2963e-02, -5.2832e-02,  1.3224e-02, -1.0944e-03,\n",
       "          -4.3710e-02,  6.4173e-02,  3.7008e-02, -1.6461e-02,  2.2598e-02,\n",
       "          -2.9824e-02,  2.6568e-02, -8.4690e-02, -5.2955e-02,  5.2313e-02,\n",
       "          -3.1278e-02,  3.5751e-02,  6.6464e-02,  5.2375e-02,  9.2044e-02,\n",
       "           5.7216e-02,  3.2299e-02, -1.4315e-02, -4.8326e-02, -2.9594e-02,\n",
       "          -6.3304e-02, -3.0828e-02,  4.5198e-02, -3.3592e-02, -4.4382e-02],\n",
       "         [-5.3022e-02, -3.7056e-02,  7.5675e-02,  9.8168e-03,  7.2575e-02,\n",
       "           6.5047e-03,  6.9503e-02,  3.3247e-02,  6.7306e-02, -5.7524e-02,\n",
       "           8.6108e-02,  9.2024e-02,  1.7776e-02,  1.1731e-02, -4.2645e-02,\n",
       "          -1.9659e-02,  2.4893e-02,  8.1153e-02,  2.0869e-02,  4.2767e-02,\n",
       "           7.9017e-02,  4.7703e-02,  8.1496e-02, -4.6672e-02,  3.9351e-02,\n",
       "           2.7199e-02, -2.1070e-02, -9.8742e-02, -8.7525e-02, -9.6211e-02,\n",
       "          -9.3249e-02, -9.8694e-02, -5.4280e-03, -3.2214e-02,  5.6640e-03,\n",
       "           4.4990e-03, -5.1164e-02, -8.7337e-02, -8.6438e-02,  9.4903e-02,\n",
       "          -4.1643e-02, -1.5422e-02,  7.0771e-02, -2.1948e-02,  9.1027e-02,\n",
       "           4.8182e-02, -2.9902e-02,  8.6548e-02, -2.4858e-02,  9.1476e-02,\n",
       "          -2.4875e-03, -6.9352e-02,  4.6371e-02,  2.2608e-02, -1.1904e-02,\n",
       "          -9.5492e-02, -8.7562e-02, -5.3970e-02, -5.3263e-02, -1.3450e-02,\n",
       "          -6.1569e-02,  9.5868e-02, -5.0867e-02, -3.8800e-02, -3.3402e-02,\n",
       "           3.1850e-02, -2.0564e-02,  3.8151e-02, -7.1517e-03, -5.1894e-02,\n",
       "          -6.2648e-02, -6.0603e-03, -1.7630e-02, -9.1276e-02, -8.7948e-02,\n",
       "          -7.6637e-02, -3.2255e-02, -9.9262e-02, -3.8909e-03, -1.8800e-02,\n",
       "          -6.0966e-02,  7.5186e-02,  2.2574e-02,  4.7953e-03,  2.5600e-02,\n",
       "           5.9571e-02, -2.9530e-02, -7.0932e-02, -6.8293e-02, -2.0733e-02,\n",
       "           3.3971e-02,  3.0256e-02,  5.1025e-02, -4.7501e-02,  1.2276e-02,\n",
       "           4.1839e-02,  7.3067e-02,  2.0036e-02,  1.8903e-02,  9.5940e-03],\n",
       "         [ 9.0383e-02, -5.7681e-02, -1.1682e-02, -7.0216e-02,  6.2297e-02,\n",
       "           9.5812e-02,  9.6655e-02, -7.8759e-02, -2.2948e-02,  8.7668e-02,\n",
       "          -9.7183e-02, -3.6795e-02, -1.4335e-02, -2.0319e-02, -9.9615e-02,\n",
       "           5.9214e-02,  5.4653e-02, -5.3755e-02,  4.7692e-02, -1.1929e-02,\n",
       "          -6.2972e-02,  6.9651e-02,  9.0205e-02, -5.5786e-02,  9.1502e-02,\n",
       "          -9.3393e-03,  7.2163e-02,  2.7141e-03,  5.6051e-02,  1.4828e-02,\n",
       "          -7.4877e-02,  7.4632e-02,  6.7000e-02,  3.4289e-02, -6.0824e-02,\n",
       "           5.8962e-02, -1.5212e-02, -2.6218e-02,  6.8894e-02, -6.9547e-02,\n",
       "          -7.4375e-03,  1.1008e-02, -3.3463e-02, -7.3957e-02, -3.8131e-02,\n",
       "          -6.1951e-02,  7.2509e-02,  1.0556e-02,  5.0844e-02,  2.8794e-02,\n",
       "          -8.4256e-02, -8.1793e-02,  1.2370e-02,  8.9906e-02,  1.7515e-02,\n",
       "          -5.6273e-02, -4.5046e-02, -1.3724e-02, -7.3346e-02, -3.6345e-04,\n",
       "           3.0944e-02, -4.4827e-02, -4.6651e-02, -2.0166e-02, -3.0478e-02,\n",
       "           1.1286e-02,  3.1860e-02,  8.8200e-02, -3.1802e-03, -1.8369e-02,\n",
       "          -7.9927e-02,  3.4806e-02, -1.8238e-02, -6.6096e-02,  5.9461e-02,\n",
       "          -3.0199e-02, -7.7663e-02, -3.2270e-02,  2.2344e-02,  8.0723e-02,\n",
       "          -3.7761e-02, -9.5567e-02,  5.2773e-03,  8.9305e-03, -3.4803e-02,\n",
       "          -6.2271e-02,  5.0972e-02, -9.2820e-02,  9.8634e-02,  5.2920e-02,\n",
       "           9.2410e-02, -4.4689e-02, -1.6316e-02, -7.9962e-02,  7.6200e-02,\n",
       "          -2.0565e-02,  9.1951e-02,  1.7664e-02, -2.4630e-02,  6.7153e-02],\n",
       "         [-1.5646e-02,  8.6492e-03, -4.3807e-02,  5.0975e-02, -4.1818e-02,\n",
       "          -9.0384e-03,  7.9329e-03, -6.7630e-02, -9.2497e-03, -5.6880e-02,\n",
       "          -2.5719e-02,  6.3091e-02,  8.1968e-03, -6.6144e-02, -3.2019e-03,\n",
       "           6.5947e-02, -9.5567e-03,  7.5309e-02,  7.8419e-02, -8.3819e-02,\n",
       "          -8.7673e-02,  1.9627e-02, -3.2958e-02, -2.2076e-02, -1.3884e-02,\n",
       "           1.9016e-02, -6.7214e-02,  3.3345e-02, -9.8466e-02,  3.1484e-02,\n",
       "           8.5080e-02, -5.7948e-02, -1.7949e-02,  5.9802e-02, -5.3520e-02,\n",
       "           1.3807e-02,  4.7548e-02,  9.9883e-02, -6.1472e-02,  4.5307e-02,\n",
       "           8.4156e-02,  6.8602e-03, -2.9183e-03,  3.3386e-02,  3.4673e-02,\n",
       "          -1.4207e-02,  9.2941e-02,  7.9690e-02, -5.8767e-02, -4.3682e-02,\n",
       "           9.9862e-02, -4.8293e-02, -1.4914e-02,  5.4368e-02,  3.0471e-02,\n",
       "           4.4704e-02, -5.1727e-02, -9.2131e-02, -7.9064e-02,  3.1736e-02,\n",
       "          -9.8871e-03,  8.0792e-02, -5.3495e-02, -3.6858e-02,  8.5324e-02,\n",
       "          -3.4024e-02, -1.3607e-02,  7.1576e-02, -8.0755e-02, -8.2998e-02,\n",
       "           1.7783e-02, -7.0056e-02,  9.5696e-02,  2.5360e-02, -7.1664e-03,\n",
       "          -7.3620e-02, -7.2580e-02, -2.7930e-02,  1.7263e-04,  1.9645e-02,\n",
       "           1.1296e-02,  6.1638e-02, -3.2124e-02, -2.5925e-02,  2.2806e-03,\n",
       "          -9.4112e-02, -1.9274e-02, -2.9198e-02,  8.7521e-02, -4.4061e-02,\n",
       "           4.4391e-05,  7.4612e-02,  3.6956e-02, -5.9457e-02,  7.3006e-02,\n",
       "           7.7619e-02,  5.3988e-03, -8.1784e-02, -7.5486e-02, -6.5660e-02],\n",
       "         [ 9.1111e-02,  1.9803e-02,  4.5763e-02,  7.5945e-02,  7.1163e-02,\n",
       "          -2.6673e-03, -1.3762e-02, -2.1966e-02,  1.5044e-02,  8.5534e-02,\n",
       "          -9.4079e-02,  9.6905e-02,  5.8938e-02, -5.6507e-02,  1.9386e-02,\n",
       "           1.8573e-02,  7.6962e-02, -9.7411e-02,  5.1486e-02, -2.4282e-02,\n",
       "          -1.0541e-02, -3.3641e-02, -4.8883e-02, -9.8360e-02,  1.4166e-02,\n",
       "           9.5363e-02,  6.3138e-02, -8.7767e-02, -5.4646e-02, -4.7374e-02,\n",
       "          -7.7166e-02, -8.7225e-02, -7.3412e-02, -3.1473e-02, -1.3635e-02,\n",
       "           4.6369e-02,  5.9560e-02, -9.6125e-02,  1.3927e-02,  2.1072e-03,\n",
       "          -6.7276e-02,  4.8933e-02, -1.5571e-02, -5.6465e-03, -9.8827e-02,\n",
       "           4.2672e-03,  7.8595e-02, -3.2308e-03,  9.3895e-02, -7.5625e-02,\n",
       "          -3.0121e-02, -9.5054e-03, -9.0091e-02,  6.1101e-02,  7.9245e-02,\n",
       "           1.3950e-03,  8.9820e-02, -4.1549e-02,  5.9188e-02, -1.7516e-02,\n",
       "           4.6014e-02,  1.8868e-03,  7.5807e-02, -1.9206e-02,  1.5796e-02,\n",
       "          -6.3270e-03, -6.6120e-02, -9.5483e-02, -5.3406e-02, -1.7455e-02,\n",
       "           7.4798e-02,  5.5930e-02,  7.7250e-02, -4.7721e-02,  3.9108e-02,\n",
       "          -3.6365e-02,  8.1111e-02, -3.6648e-02,  9.7573e-02,  5.0042e-02,\n",
       "          -2.8013e-02, -2.2993e-02, -8.6472e-02,  3.0635e-02, -4.6682e-02,\n",
       "           6.2842e-03, -7.5514e-02, -5.1077e-02, -6.3812e-02,  4.6340e-03,\n",
       "           4.8216e-02,  9.8458e-02, -5.1634e-03, -7.4142e-02,  6.1539e-02,\n",
       "           3.5882e-02,  4.4224e-02, -8.7874e-02,  5.0325e-02, -5.6958e-02],\n",
       "         [ 7.1400e-02, -6.0285e-02,  3.6825e-02, -6.0568e-02, -8.4623e-02,\n",
       "          -8.2223e-02,  2.7137e-02,  9.8576e-02, -8.3072e-02, -6.0827e-02,\n",
       "           6.3076e-02, -3.3593e-02,  5.1892e-02,  7.2600e-02, -6.0279e-02,\n",
       "          -9.9094e-02, -3.6860e-02, -9.1704e-02,  8.6664e-02,  6.7669e-02,\n",
       "          -9.6704e-02,  3.2262e-02,  6.3908e-02,  3.6675e-02, -5.8346e-02,\n",
       "          -2.1408e-02,  1.0270e-02,  6.2539e-02, -9.8323e-02,  8.7451e-02,\n",
       "          -2.4031e-03,  6.1259e-02, -7.7510e-02,  9.8198e-02, -5.4994e-02,\n",
       "          -9.9588e-02,  7.1313e-02, -9.0112e-03,  1.5523e-02, -4.0783e-02,\n",
       "          -3.0050e-02, -9.2109e-02, -7.7364e-02,  8.1113e-02, -2.6844e-03,\n",
       "          -5.7339e-02,  5.9389e-02,  4.2766e-02, -1.9382e-02, -7.9727e-02,\n",
       "           7.6497e-02, -3.4434e-02, -8.5850e-02, -5.4117e-04,  6.1692e-02,\n",
       "           9.3139e-03, -7.4157e-02,  2.2936e-02, -9.6256e-02,  2.9319e-03,\n",
       "           8.7098e-02, -6.4462e-02, -1.6422e-03, -9.6879e-02,  9.2713e-02,\n",
       "           5.9630e-02, -7.9851e-02,  6.0855e-02,  1.8002e-02, -4.9559e-02,\n",
       "          -4.4835e-02, -5.1942e-03,  2.4689e-02, -2.5319e-02, -4.0780e-02,\n",
       "           9.0366e-02, -7.5026e-02, -3.8174e-02,  9.7890e-02,  8.1828e-02,\n",
       "           7.6649e-02, -4.3655e-02,  4.3900e-03,  5.3518e-02,  9.6959e-02,\n",
       "           7.6464e-02, -3.6910e-02,  2.9750e-02, -6.6074e-02,  9.5311e-02,\n",
       "           6.9587e-03,  3.0637e-02,  4.6670e-02,  7.0229e-03,  7.0771e-02,\n",
       "           3.9914e-02,  3.3862e-02, -8.6490e-02, -8.6336e-02, -4.4210e-02],\n",
       "         [ 3.5734e-02, -1.8946e-02,  6.3628e-02,  8.5418e-02, -7.0267e-03,\n",
       "           8.8201e-02,  4.4511e-02,  1.5678e-02, -7.6736e-02, -9.1260e-02,\n",
       "          -9.6353e-02,  1.3090e-02,  4.3279e-02,  2.2044e-02, -3.7538e-02,\n",
       "           1.3789e-02, -4.0879e-02, -5.0310e-02, -4.3269e-02, -1.4325e-02,\n",
       "           7.4385e-02, -2.6589e-02,  7.4737e-02, -6.8087e-02,  1.9981e-02,\n",
       "           5.8508e-02, -5.4038e-02, -6.3603e-02,  7.2559e-02,  7.4735e-02,\n",
       "           2.9706e-02,  7.7737e-02, -8.8975e-02,  8.9510e-02, -2.7400e-02,\n",
       "          -8.9392e-02, -9.4362e-02,  9.5322e-02, -6.9894e-02, -8.1421e-02,\n",
       "          -8.8827e-02,  3.7869e-02, -6.9353e-02, -5.1396e-02,  6.5272e-02,\n",
       "           8.5132e-03,  2.9295e-02,  5.1894e-02,  6.7858e-02, -8.1233e-02,\n",
       "           6.2335e-02,  8.3558e-02,  4.1984e-02,  7.8306e-02,  8.4119e-02,\n",
       "           8.3397e-02,  2.0789e-02,  8.1239e-02,  5.1959e-02,  9.6810e-02,\n",
       "           6.8460e-02, -3.7260e-02, -6.9375e-02,  9.0274e-02, -2.8073e-02,\n",
       "           6.9595e-02,  7.8001e-02, -2.5842e-02,  1.9400e-02,  8.6912e-02,\n",
       "           4.4703e-02,  6.0196e-02,  5.8641e-02, -3.8629e-02,  4.1970e-02,\n",
       "           5.3282e-02,  7.0029e-02, -6.9101e-02, -5.7271e-02, -4.2210e-02,\n",
       "          -7.5856e-02, -6.3131e-02, -6.3077e-02,  1.9691e-02,  2.3076e-02,\n",
       "          -5.9309e-03,  1.5546e-02,  4.5171e-03,  8.1809e-02, -4.3520e-02,\n",
       "          -9.4261e-02,  8.7058e-02,  7.6195e-02, -3.2543e-02,  2.5613e-02,\n",
       "          -1.8750e-02,  6.4419e-02,  6.5162e-02, -1.7087e-02,  9.9899e-02],\n",
       "         [ 8.5466e-02,  5.8800e-02,  2.0956e-02, -1.0535e-02, -7.4820e-03,\n",
       "           1.0998e-02,  2.9250e-02, -3.3904e-03, -5.3728e-02, -5.6472e-02,\n",
       "           7.0063e-02, -9.5975e-02, -1.0165e-02,  9.9290e-02,  6.2447e-02,\n",
       "           8.5130e-02,  2.0147e-02, -3.2079e-02,  1.4534e-02, -9.9817e-03,\n",
       "           6.0922e-02, -5.0372e-02,  8.9358e-02, -3.8338e-02,  2.4102e-02,\n",
       "          -9.2394e-03,  4.9123e-02, -6.0181e-02, -7.5673e-02,  6.1160e-02,\n",
       "           3.0747e-02, -6.6193e-02,  8.8830e-02,  7.1679e-02, -7.2311e-02,\n",
       "          -3.9586e-02, -3.2604e-02, -5.4023e-02,  1.1134e-02,  9.5330e-02,\n",
       "          -9.4468e-02, -1.0209e-02, -3.6484e-03, -8.6922e-02, -6.6054e-02,\n",
       "          -6.3857e-02,  3.3501e-02, -9.8990e-02,  3.4338e-02,  2.0003e-02,\n",
       "          -2.6095e-02,  1.2341e-02, -1.3789e-02, -5.2379e-02,  6.1698e-02,\n",
       "           4.0007e-02, -8.6417e-02,  7.3322e-03, -6.5356e-04,  4.4953e-02,\n",
       "          -6.0058e-02,  7.5180e-02,  7.2966e-02,  2.6748e-03, -2.0191e-02,\n",
       "           4.8737e-02, -4.9209e-02,  9.3945e-02, -9.7195e-02, -7.8109e-03,\n",
       "           2.8165e-02, -3.6771e-02,  1.0136e-02, -3.9718e-02, -9.3420e-02,\n",
       "          -9.9874e-02, -6.8827e-03,  1.6895e-02,  9.4178e-02,  3.1650e-02,\n",
       "           2.5956e-02,  5.9788e-02,  9.5387e-02, -4.9860e-02, -6.3877e-03,\n",
       "           5.2031e-02, -9.3065e-02,  6.1561e-02, -4.0432e-02, -7.7355e-02,\n",
       "           1.9406e-02,  9.1549e-02,  7.7562e-02, -3.7436e-03, -2.1180e-02,\n",
       "          -6.3490e-02, -2.2797e-02,  8.2969e-02, -4.5993e-02, -2.6156e-02]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([ 0.0195,  0.0741,  0.0450,  0.0114,  0.0267, -0.0083,  0.0631,  0.0048,\n",
       "         -0.0673, -0.0816], requires_grad=True)]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 18
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "## 训练\n",
    "\n",
    "pytorch的训练需要自行实现，包括\n",
    "1. 定义损失函数\n",
    "2. 定义优化器\n",
    "3. 定义训练步\n",
    "4. 训练"
   ],
   "id": "d56559518e627fcd"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:46.916718Z",
     "start_time": "2025-01-16T10:32:46.912050Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 1. 定义损失函数 采用交叉熵损失\n",
    "loss_fct = nn.CrossEntropyLoss()  # 内部先做softmax，然后计算交叉熵\n",
    "\n",
    "# 2. 定义优化器 采用SGD\n",
    "#    随机梯度下降（Stochastic Gradient Descent, SGD） 的优化器。\n",
    "# （1）必需参数\n",
    "#      params：模型的参数，通常通过 model.parameters() 获取，获取模型的所有可训练参数（权重和偏置）。\n",
    "#      lr：学习率（Learning Rate），控制参数更新的步长。\n",
    "#（2）可选参数\n",
    "#      momentum：动量（Momentum），用于加速 SGD 的收敛过程，减少震荡。默认值为 0。\n",
    "#      weight_decay：L2 正则化系数，用于防止过拟合。默认值为 0。\n",
    "#      dampening：动量的阻尼系数，用于减少动量的影响。默认值为 0。\n",
    "#      nesterov：是否使用 Nesterov 动量。默认值为 False。\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)  # 学习率0.01"
   ],
   "id": "25d5f5b61ef5b3e0",
   "outputs": [],
   "execution_count": 19
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:32:47.052346Z",
     "start_time": "2025-01-16T10:32:46.917721Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "\n",
    "@torch.no_grad()  # 装饰器，禁止反向传播，节省内存\n",
    "def evaluate(model, data_loader, loss_fct):\n",
    "    loss_list = []  # 记录损失\n",
    "    pred_list = []  # 记录预测\n",
    "    label_list = []  # 记录标签\n",
    "    for datas, labels in data_loader:\n",
    "        datas = datas.to(device)  # 转到GPU\n",
    "        labels = labels.to(device)  # 转到GPU\n",
    "\n",
    "        # 前向计算\n",
    "        logits = model(datas)  # 得到预测值\n",
    "        loss = loss_fct(logits, labels)  # 验证集损失,loss尺寸是一个数值\n",
    "        loss_list.append(loss.item())  # 记录损失,item是把tensor转换为数值\n",
    "\n",
    "        # logits.shape:torch.Size([32, 10]) \n",
    "        # 用于从模型的输出（logits）中获取预测的类别标签。\n",
    "        # logits 是模型最后一层的原始输出，通常是未经过激活函数（如 Softmax）处理的分数。\n",
    "        # 对于分类任务，logits 的形状通常是 (batch_size, num_classes)，其中：batch_size 是批次中的样本数量。 num_classes 是类别的数量。\n",
    "        # argmax 是一个数学操作，用于返回数组中最大值所在的索引。\n",
    "        # 在分类任务中，logits.argmax(axis=1) 的作用是：\n",
    "        # 沿着类别维度（axis=1）找到每个样本的最大值对应的索引。这个索引就是模型预测的类别标签。\n",
    "        preds = logits.argmax(axis=1)\n",
    "        # 将PyTorch张量转换为NumPy数组。只有当张量在CPU上时，这个转换才是合法的\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())  # 记录预测\n",
    "        label_list.extend(labels.cpu().numpy().tolist())  # 记录标签\n",
    "\n",
    "    acc = accuracy_score(label_list, pred_list)  # 计算准确率\n",
    "    return np.mean(loss_list), acc\n"
   ],
   "id": "ad29152176dc79a7",
   "outputs": [],
   "execution_count": 20
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:42:19.655786Z",
     "start_time": "2025-01-16T10:32:47.054349Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 训练过程\n",
    "# 1. 训练集训练\n",
    "# 2. 验证集评估\n",
    "# 3. 保存模型\n",
    "# 4. 记录训练过程\n",
    "\n",
    "# epoche 训练轮数,eval_step 评估间隔\n",
    "def training(model, train_loader, val_loader, epoch, loss_fct, optimizer,\n",
    "             eval_step=500):\n",
    "    record_dict = {\n",
    "        \"train:\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "\n",
    "    global_step = 0  # 全局步数\n",
    "    model.train()  # 训练模式\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:  # 进度条\n",
    "        for epoch_id in range(epoch):  # 训练epoch次\n",
    "            # 训练集训练\n",
    "            for datas, labels in train_loader:  #执行次数是60000/32=1875\n",
    "                datas = datas.to(device)  # 转到GPU ,datas尺寸是[batch_size,1,28,28]\n",
    "                labels = labels.to(device)  # 转到GPU ,labels尺寸是[batch_size]\n",
    "\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)  # 得到预测值\n",
    "\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)  # 训练集损失\n",
    "\n",
    "                # 梯度回传\n",
    "                loss.backward()  # loss.backward()会计算梯度，loss对模型参数求导\n",
    "\n",
    "                # 调整优化器，包括学习率的变动等,优化器的学习率会随着训练的进行而减小，更新w,b\n",
    "                optimizer.step()  # 更新参数\n",
    "                #梯度是计算并存储在模型参数的.grad 属性中，优化器使用这些存储的梯度来更新模型参数\n",
    "\n",
    "                preds = logits.argmax(axis=-1)  # 得到预测值,-1表示最后一维\n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())  # 计算准确率\n",
    "                loss = loss.cpu().item()  # 损失转到CPU，item()取值,一个数值\n",
    "\n",
    "                record_dict[\"train:\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                })  # 记录训练集信息，每一步的损失，准确率，步数\n",
    "\n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:  # 评估间隔\n",
    "                    model.eval()  # 评估模式\n",
    "                    # 验证集评估\n",
    "                    val_loss, val_acc = evaluate(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })  # 记录验证集信息\n",
    "                    model.train()  # 训练模式\n",
    "\n",
    "                # 更新step\n",
    "                global_step += 1  # 全局步数\n",
    "                pbar.update(1)  # 更新进度条\n",
    "                pbar.set_postfix({\"epoch\": epoch_id})  # 设置进度条显示信息\n",
    "\n",
    "    return record_dict\n",
    "\n",
    "\n",
    "epoch = 40  # 训练轮数\n",
    "model = model.to(device)  # 转到GPU\n",
    "record_dict = training(model, train_loader, val_loader, epoch, loss_fct, optimizer,\n",
    "                       eval_step=1000)"
   ],
   "id": "4239695eb2f08d54",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/75000 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "d9ac210fb6564531a10ebe342c3718ab"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 21
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "",
   "id": "d37ae76260656962"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:42:19.662374Z",
     "start_time": "2025-01-16T10:42:19.656787Z"
    }
   },
   "cell_type": "code",
   "source": "record_dict[\"train:\"][-5:]",
   "id": "e07b604cafd62d50",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.4948585629463196, 'acc': 0.875, 'step': 74995},\n",
       " {'loss': 0.4144577980041504, 'acc': 0.84375, 'step': 74996},\n",
       " {'loss': 0.09068328887224197, 'acc': 0.96875, 'step': 74997},\n",
       " {'loss': 0.13642819225788116, 'acc': 0.96875, 'step': 74998},\n",
       " {'loss': 0.11406785249710083, 'acc': 0.96875, 'step': 74999}]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 22
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:42:19.669329Z",
     "start_time": "2025-01-16T10:42:19.663378Z"
    }
   },
   "cell_type": "code",
   "source": "record_dict[\"val\"][-5:]",
   "id": "1db205285188c703",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.33414271667885326, 'acc': 0.8827, 'step': 70000},\n",
       " {'loss': 0.3243673247770189, 'acc': 0.8864, 'step': 71000},\n",
       " {'loss': 0.3285821487549871, 'acc': 0.8821, 'step': 72000},\n",
       " {'loss': 0.32762905220968275, 'acc': 0.8827, 'step': 73000},\n",
       " {'loss': 0.3220669867726751, 'acc': 0.8884, 'step': 74000}]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 23
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T11:42:16.723923Z",
     "start_time": "2025-01-15T11:42:16.701524Z"
    }
   },
   "cell_type": "code",
   "source": "record_dict[\"val\"][0:]",
   "id": "c96754a78db959ea",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.34692019389603085, 'acc': 0.8778, 'step': 0},\n",
       " {'loss': 0.3438026423271472, 'acc': 0.8776, 'step': 1000},\n",
       " {'loss': 0.34571839002565075, 'acc': 0.8776, 'step': 2000},\n",
       " {'loss': 0.3496059393778015, 'acc': 0.8731, 'step': 3000},\n",
       " {'loss': 0.34296425639059597, 'acc': 0.8785, 'step': 4000},\n",
       " {'loss': 0.35371193315940924, 'acc': 0.8744, 'step': 5000},\n",
       " {'loss': 0.3404914085952619, 'acc': 0.8789, 'step': 6000},\n",
       " {'loss': 0.35541819638242356, 'acc': 0.8718, 'step': 7000},\n",
       " {'loss': 0.3360208019899865, 'acc': 0.8797, 'step': 8000},\n",
       " {'loss': 0.35091029785978145, 'acc': 0.8718, 'step': 9000},\n",
       " {'loss': 0.3356817705086626, 'acc': 0.8809, 'step': 10000},\n",
       " {'loss': 0.33540023182527706, 'acc': 0.8792, 'step': 11000},\n",
       " {'loss': 0.3430856076863627, 'acc': 0.8766, 'step': 12000},\n",
       " {'loss': 0.3302017900938043, 'acc': 0.8825, 'step': 13000},\n",
       " {'loss': 0.32961663051535145, 'acc': 0.8835, 'step': 14000},\n",
       " {'loss': 0.3407776233034964, 'acc': 0.8771, 'step': 15000},\n",
       " {'loss': 0.3281941329376004, 'acc': 0.8837, 'step': 16000},\n",
       " {'loss': 0.32782166959426273, 'acc': 0.882, 'step': 17000},\n",
       " {'loss': 0.3293627442690892, 'acc': 0.8811, 'step': 18000},\n",
       " {'loss': 0.3282308237502179, 'acc': 0.8821, 'step': 19000},\n",
       " {'loss': 0.32891682168831843, 'acc': 0.8825, 'step': 20000},\n",
       " {'loss': 0.32286034829129046, 'acc': 0.8846, 'step': 21000},\n",
       " {'loss': 0.3407052903415296, 'acc': 0.8783, 'step': 22000},\n",
       " {'loss': 0.327025972759, 'acc': 0.883, 'step': 23000},\n",
       " {'loss': 0.33006252736424485, 'acc': 0.879, 'step': 24000},\n",
       " {'loss': 0.32592459109882577, 'acc': 0.8853, 'step': 25000},\n",
       " {'loss': 0.3250121347391948, 'acc': 0.8853, 'step': 26000},\n",
       " {'loss': 0.3175377904678496, 'acc': 0.886, 'step': 27000},\n",
       " {'loss': 0.33689355530058995, 'acc': 0.8799, 'step': 28000},\n",
       " {'loss': 0.3325446361836534, 'acc': 0.883, 'step': 29000},\n",
       " {'loss': 0.3221770902387441, 'acc': 0.8861, 'step': 30000},\n",
       " {'loss': 0.32365487678982197, 'acc': 0.8857, 'step': 31000},\n",
       " {'loss': 0.32580691917588156, 'acc': 0.8844, 'step': 32000},\n",
       " {'loss': 0.32320602015612987, 'acc': 0.8862, 'step': 33000},\n",
       " {'loss': 0.3245544924308507, 'acc': 0.8865, 'step': 34000},\n",
       " {'loss': 0.3223902311878273, 'acc': 0.8854, 'step': 35000},\n",
       " {'loss': 0.32689027697704853, 'acc': 0.8845, 'step': 36000},\n",
       " {'loss': 0.3282073708340383, 'acc': 0.8857, 'step': 37000},\n",
       " {'loss': 0.333485457201164, 'acc': 0.8834, 'step': 38000},\n",
       " {'loss': 0.3217686141927402, 'acc': 0.889, 'step': 39000},\n",
       " {'loss': 0.3166271143328077, 'acc': 0.8888, 'step': 40000},\n",
       " {'loss': 0.32617379552402054, 'acc': 0.8849, 'step': 41000},\n",
       " {'loss': 0.3304516286990894, 'acc': 0.8844, 'step': 42000},\n",
       " {'loss': 0.31992836553639115, 'acc': 0.8844, 'step': 43000},\n",
       " {'loss': 0.32321614653062514, 'acc': 0.8849, 'step': 44000},\n",
       " {'loss': 0.3206304703800442, 'acc': 0.8893, 'step': 45000},\n",
       " {'loss': 0.34405398541412796, 'acc': 0.8815, 'step': 46000},\n",
       " {'loss': 0.3182983312029808, 'acc': 0.8886, 'step': 47000},\n",
       " {'loss': 0.32037165990700356, 'acc': 0.8882, 'step': 48000},\n",
       " {'loss': 0.3236420843869257, 'acc': 0.8891, 'step': 49000},\n",
       " {'loss': 0.3288705299694698, 'acc': 0.8856, 'step': 50000},\n",
       " {'loss': 0.3214752458559629, 'acc': 0.8898, 'step': 51000},\n",
       " {'loss': 0.3159914725123884, 'acc': 0.8891, 'step': 52000},\n",
       " {'loss': 0.32982922761965866, 'acc': 0.8876, 'step': 53000},\n",
       " {'loss': 0.31940507884628283, 'acc': 0.8889, 'step': 54000},\n",
       " {'loss': 0.31566471318467354, 'acc': 0.8899, 'step': 55000},\n",
       " {'loss': 0.3561408489990158, 'acc': 0.8806, 'step': 56000},\n",
       " {'loss': 0.3202829395417874, 'acc': 0.8903, 'step': 57000},\n",
       " {'loss': 0.3266066562372465, 'acc': 0.89, 'step': 58000},\n",
       " {'loss': 0.3375616516180027, 'acc': 0.8826, 'step': 59000},\n",
       " {'loss': 0.32320125210589873, 'acc': 0.8885, 'step': 60000},\n",
       " {'loss': 0.3168879949008695, 'acc': 0.8909, 'step': 61000},\n",
       " {'loss': 0.3251598965936004, 'acc': 0.8882, 'step': 62000},\n",
       " {'loss': 0.3228421869655006, 'acc': 0.8878, 'step': 63000},\n",
       " {'loss': 0.3239617553024818, 'acc': 0.8897, 'step': 64000},\n",
       " {'loss': 0.32771405359855094, 'acc': 0.8905, 'step': 65000},\n",
       " {'loss': 0.32424132292643904, 'acc': 0.8909, 'step': 66000},\n",
       " {'loss': 0.3353280100864343, 'acc': 0.8882, 'step': 67000},\n",
       " {'loss': 0.3223925023176038, 'acc': 0.8915, 'step': 68000},\n",
       " {'loss': 0.33060767731299034, 'acc': 0.8907, 'step': 69000},\n",
       " {'loss': 0.33491054183235186, 'acc': 0.8896, 'step': 70000},\n",
       " {'loss': 0.33291255632718914, 'acc': 0.8845, 'step': 71000},\n",
       " {'loss': 0.3267328876573533, 'acc': 0.8934, 'step': 72000},\n",
       " {'loss': 0.33012885374192613, 'acc': 0.8902, 'step': 73000},\n",
       " {'loss': 0.33434019510309915, 'acc': 0.8895, 'step': 74000}]"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 51
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:53:04.033055Z",
     "start_time": "2025-01-16T10:53:03.787367Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def plot_record_curves(record_dict, sample_step=1000):\n",
    "    # .set_index(\"step\") 将 step 列设置为 DataFrame 的索引\n",
    "    train_df = pd.DataFrame(record_dict[\"train:\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "\n",
    "    last_step = train_df.index[-1]  # 最后一步的步数\n",
    "\n",
    "    print(train_df)\n",
    "    print(val_df)\n",
    "\n",
    "    # 画图 \n",
    "    fig_num = len(train_df.columns)  # 画两张图,分别是损失和准确率\n",
    "\n",
    "    # plt.subplots：用于创建一个包含多个子图的图形窗口。\n",
    "    # 1：表示子图的行数为 1。\n",
    "    # fig_num：表示子图的列数，即子图的数量。\n",
    "    # figsize=(5 * fig_num, 5)：设置整个图形窗口的大小，宽度为 5 * fig_num，高度为 5。\n",
    "    # fig：返回的图形对象（Figure），用于操作整个图形窗口。\n",
    "    # axs：返回的子图对象（Axes 或 Axes 数组），用于操作每个子图。\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        # train_df.index 是 x 轴数据（通常是 step）。\n",
    "        # train_df[item] 是 y 轴数据（当前指标的值）。\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=\"train:\" + item)\n",
    "        # val_df.index 是 x 轴数据。\n",
    "        # val_df[item] 是 y 轴数据。\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=\"val:\" + item)\n",
    "        axs[idx].grid()  # 显示网格\n",
    "        axs[idx].legend()  # 显示图例\n",
    "        axs[idx].set_xticks(range(0, train_df.index[-1], 5000))  # 设置x轴刻度\n",
    "        axs[idx].set_xticklabels(map(lambda x: f\"{x // 1000}k\", range(0, last_step + 1, 5000)))  # 设置x轴标签\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "plot_record_curves(record_dict)"
   ],
   "id": "7e608928f612cc3d",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "           loss      acc\n",
      "step                    \n",
      "0      2.314446  0.03125\n",
      "1000   0.685512  0.78125\n",
      "2000   0.618628  0.71875\n",
      "3000   0.517243  0.78125\n",
      "4000   0.622242  0.78125\n",
      "...         ...      ...\n",
      "70000  0.300630  0.87500\n",
      "71000  0.289072  0.96875\n",
      "72000  0.216904  0.90625\n",
      "73000  0.518734  0.84375\n",
      "74000  0.164593  0.93750\n",
      "\n",
      "[75 rows x 2 columns]\n",
      "           loss     acc\n",
      "step                   \n",
      "0      2.301878  0.0478\n",
      "1000   0.836631  0.6821\n",
      "2000   0.657720  0.7690\n",
      "3000   0.578762  0.7969\n",
      "4000   0.535608  0.8103\n",
      "...         ...     ...\n",
      "70000  0.334143  0.8827\n",
      "71000  0.324367  0.8864\n",
      "72000  0.328582  0.8821\n",
      "73000  0.327629  0.8827\n",
      "74000  0.322067  0.8884\n",
      "\n",
      "[75 rows x 2 columns]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzoAAAHACAYAAABqJx3iAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA2y9JREFUeJzsnQd8W+X1/h9J3tuOY8fZe5MdIIQVSAKEUSirQIHSlk46oJMO5r9AW0qh/THKKm0pZe8ESAgESAhkQ/becRzb8d4a/895731lSZZsyZZsyXq+n8+NhqVXr65upPe555znWFwulwuEEEIIIYQQ0ouw9vQECCGEEEIIISTcUOgQQgghhBBCeh0UOoQQQgghhJBeB4UOIYQQQgghpNdBoUMIIYQQQgjpdVDoEEIIIYQQQnodFDqEEEIIIYSQXgeFDiGEEEIIIaTXkYAYwOl04siRI8jMzITFYunp6RBCSNwgPaVramrQv39/WK08N6bh7xIhhET/b1NMCB35MRk0aFBPT4MQQuKWgwcPYuDAgT09jaiBv0uEEBL9v00xIXTkjJl+M1lZWSE/v6WlBYsXL8b8+fORmJgYljlFYsxYGzeW5hqpcTnX2Bo3luYayXFDobq6Wi3o9fcwid7fpVgbN5bmGqlxY2mukRqXc42tcVui4HcplN+mmBA6Oi1Afkw6+4OSlpamnhvODzrcY8bauLE010iNy7nG1rixNNdIjtsZmJ4V/b9LsTZuLM01UuPG0lwjNS7nGlvjtkTR71Iwv01MuCaEEEIIIYT0Oih0CCGEEEIIIb0OCh1CCCGEEEJIryMmanQIIdGP3W6Hw+EI23iSB5yQkIDGxsawjRuJMWNxXE9sNpt6DdbgEEII6W1Q6BBCurwYz8vLw969e8O6WBaP/H79+ilXq3CNG4kxY3FcX6SwtKioCElJSRF7DUIIIaS7odAhhHSpaeKBAweQm5urmnYlJyeHbUEuY9fW1iIjIyNsjSojMWYsjusppJqbm1FaWqqE6qhRo9gUlBBCSK+BQocQ0mlkkSyL8b59+yqryXAv8mX8lJSUsAqdcI8Zi+N6kpqaqixC9+/f734tQgghpDfAU3eEkC7D+o7YhlEcQgghvRH+uhFCCCGEEEJ6HRQ6hBBCCCGEkF4HhQ4hhHSR4cOH49FHH+3SGN/4xjdw8cUXh21O8cTHH3+MCy+8UBliSBrl66+/3uFzli1bhmnTpikDjZEjR+KZZ57plrkSQgjpPih0CCFxyZlnnomf/vSnYRnr888/x/XXXx+WsUjo1NXVYfLkyXj44YeDerw4zJ1//vmYM2cONmzYoI6Db3/723jvvfciPldCCCHdB13XCCEkgPWyNOmUZpodIa5z1dXV3TIv0pbzzjtPbcHy2GOPYdiwYfjLX/6ibo8bNw7Lly/HX//6V5xzzjkRnCkhhJDupNcLnU93leGutzYjw2HFgp6eDCFxIhAaWhxhsVZuaHYgodketCtYaqItKAe4G264AR999JHaHnroIXXfP//5T3X/okWL8Lvf/Q4bN27E4sWLMWjQINxyyy347LPPVORAFsX33nsv5s6d65W69t3vfhe/+tWv1G2ZwxNPPIGFCxeqKMGAAQPUovqiiy4K+v03NTXh5z//OZ5//nnU1NRgxowZaiE+c+ZM9feKigrcdNNNao7Sa2fgwIH4zW9+o96D2ETLnF955RX1uMLCQnzve9/DrbfeGvTr92ZWrlzp9fkJInDai/DJ5yGbRgtbaZgrW6jo53Tmub1l3Fiaa2fGLa5qxG9f34xvnDIEp4/KD8uYwRJL43KusTVuS4Tm2tl5IN6FTl2zA9tKajE0g/a3hHQHInLG39YzKUBb7joHaUkdf609+OCD2LlzJyZOnIi77rpL3bd582Z1+etf/xr333+/Ei/SCPXgwYNYsGAB/vCHP6h6jn//+9+qHmT79u0YPHhwwNe488478ac//Ql//vOf8fe//x3XXHON6lWTl5en/j506FBVl3PHHXf4ff4vf/lLvPrqq3jkkUeUuJI5yWJ8165daozf//732LJlC9555x3k5+er+xsaGtRz//a3v+HNN9/Eiy++qOYo70E2YnD06FEl/jyR2yJeZB9KbyFfRNzKZ+qLCM20tLROz2XJkiWdfm5vGTeW5hrKuB8VW/DJPhvKy0pRO84ZljFDJZbG5Vxja9wlEZprsNTX1wf1uF4vdPoeW4H3k36L/Q5ZkDAlgRACZGdnIykpSS1Q+/Xrp+7btm2buhThM2/ePPdjRVRI/Yfm7rvvxmuvvaaEhERUAiEi5qqrrlLX77nnHiU+Vq1ahXPPPVfdN2LECCVQ/CGRIzE3ePrpp9VcpBmrRIjkh+Wpp57CL37xCxw4cABTp05VkR4tnDTyt1GjRuHUU09V0aUhQ4Z0cY8RiYZJlEwjokiiffPnz1efT2fORsrnKZ+vNGwNF7E0bizNtTPj7li6C9i3B0jNxoIFs6J6rj05LucaW+O2RGiuoRJsunivFzqJzkaMtB5Bk6vtGTpCSPiR9DGJrIQjda2mugaZWZkhpa51FS0cNJIWJlEXSUMrLi6G3W5XZ/1FTLTHpEmT3NfT09PVYvjYsWPu+5YuXRrwubt371Y/JrNnz3bfJz8oJ554IrZu3apuf//738ell16KdevWqcW2OLadcsopbpElP0JjxoxRwuqCCy5QjyEGIm5LSkq87pPb8hn5i+YIEs2TzRf5XLryY9/V5/eGcWNprqGMW9VoV5dltc0dPr6n5xoN43KusTVuYoTmGsrrB0OvFzqWBGNH2ND1mgFCSMdIBCGY9LFghI49yabGClbohAMRJZ5InYycvZLUMbEhloXwZZddpupgQvkSlv0i7ylcSPG9pMJJTZHM7+yzz8YPf/hDNU+xTRZnMUlre//993HFFVeompSXX345bK8fy8yaNUvtN09kH8r9hISLijqjhqCstgkOpws2K1PoCeluer29tNWWpC4pdAghnkjqmriqdcSKFStUhOSSSy7BCSecoKIB+/bti+jcJK1N5ievrZEIz+rVqzF+/HgvtzextX722WdV3dHjjz/u/ptEJ6688kqV8vbCCy8oY4Ljx4+jNyJRN7GJlk0QkSfXddRN0s6uu+469+PFmGHPnj2qDkpSFqUOSuqZbr755h57D6T3UVFvnAxxuoDjde2fGCGERIZeH9GxmhGdBBeFDiGkFalpkf43IloyMjICRluk1kVMAcSAQKIyYgIQjsiMRGBEPPmr85GokqSmiYtbSkoKxo4dqyI1Unz5rW99Sz3mtttuw/Tp0zFhwgTlBvb2228r0wLhgQceQFFRkarhkWjYSy+9pARaTk4OeiNr1qxRPXE0upZGRKA0ApWUQ89UQ7GWllREETbiuieOdU8++SStpUlY8RQ3x2oa0TezbeojISSy9H6hY2PqGiGkLZKSJgthiZBIzY3YS/tDRMM3v/lNVf8i5gEiPsLRM0fqcMrKygL+/b777lMRJ4k+SMRCaofEqlqc4ASJ+EikQoSapNOddtppyopayMzMVI5v4ixns9mUJbWkanVnCmB3N38VW/NAiNjx95z169dHeGYknqmsb7W/La1ptSYnhHQfvV/osEaHEOKH0aNHq34qnkiKmr/IzwcffOB1n9TCeCJpUJ7ix9+iu7Ky0uu2b/qb72JcIjkSbRCXN0lD8xUp0utHNn/ceOONaiOE9AzyHXDcTF0TjlHoENIj9M7Te35qdBIodAghhBDSDdQ3O9Bsb01xZUSHkJ6h1wsdm+l8RKFDCCGEkO40ItBQ6BDSM8RNjU4CDD97QgghhJDusJaOVqFT22THi6sP4rwT+qEoO/r7DL645iD2ltV53TcoNw1XnThImcR0dh+8svYQLp4yANlp/nuyrD9QgSVbSqCTkZ0OJw4esmBWfTMKsnuuh4ywdv9xdVydO7GoR+fhcLrw38/34+ThfTC6MBPRRu8XOglMXSOEEEJIz0V0xHUtmnh5zUHc9fYW7CipwX2XtjY3jkY+21OOX778pd+/jS7MwIyheZ0a9/+9vQXPrz6I8rpm3DJvtN/H3PzCBuwrr/e514as93fhvksno6dwOl349r/WoKK+Ba/94BRMHWyY1PQEy7Yfw21vbMaMIbl4+ftG0+pootenriW4U9fC16iPEEIIIaQjoZOcYI1KM4KDFQ3qcndpLaIdiTwJUwfn4FunDlPbyIIMdd+Gg94mL8FS12THm18cUdcPlHtHijzFxCFzP1190mD1ul+d2l/dfvvLo2ho7rkT6PvK65TIEV5ccwg9yW7zGNp4uAp2R/SttXu90LG5Izr2du1HCSGEEELC2UNnVGFGVKauaeGlF/LRSnVjCxZtKlbXb7tgPH5vbhdMMtK1thzpnNX/wo3FyjCiPREqYtXudEEy4+68aIJ63XsvnoA+yS6V9vbuZmNePcFmj/f91hdHelR0HTKPoSa7E3t80gujgTgQOqa9tMUVVBd0QgghhJCuoM+265oFWVTL4jhaOFZtpNIdrW5Ekz1610Zvf1GMxhYnRhVkYMqg1obHE/pnt1nwh8JLa4woUXsiVAugvLQkJNqM5bLVasFJBUbU4sXVPRdJ8Xzfcly9Y4rBnuDg8dbUvs1HqhBt9H6hk9jaidjR4p0zSwghhBASbirMiM6AnFRkJCdEXVSntNaYiyS6HKmMrvohXxMC4YoZ3qYDEwdkqctdpbVobAlNqO0prcXqfRXu24EiOvrz6pvZuo4UZvY1ojwr95TjQJv6ne5BC4ohfdK89lNPpkEKmw93vZl2uOn1QifBjOgILXZvFxRCCOks0kj0wQcfDPh3aQCak9N6BpIQEj/oZqG5aUnuhbKOokQDpdWti/tDFT2zWO8IMUqQGpwEqwWXTBvg9bd+WSnIS09Sjl/bj9aENK6uaZk22Ph+rmpo8RvVOhZA6OQlA7NH9FHXX1rb/QJDyjB0yt6vzx2rRNdne45jf4Bao0jPxfP46WyELZLETeqa4KTQIYQQQkiEqTSFjizG9UJZR1F6GqnnqPFIozt4PDrrdHR62dnjCpCf4S02JLozoX9WyItrKZZ/ZZ0hdG48bTiSzJQ0f9G2QBEd4TJTeL289pASW91JSXWTcoqzWS2YM7YAp43qq+5/qQdMCcpqm1VqoWekKdrq4Xu90ElINMwIBDuFDiGEEEIizHGzj05OWqJHRCc6hI7vov5gFEZ0mu1OvLrusDttzR/j3UIn+LqQj3aUqvffJz0JZ48rbP1s/AgdbQlekJnS5m9zx/ZFdmoiiqsasXxXGboT/X5H9E1HSqINV5r7pydE10Hz2BEhmmizoLrRHnUGF71e6FisNjhcRl6noyU6vmQIIT3L448/jv79+8Pp9LbC/MpXvoJvfvOb2L17t7peWFiIjIwMzJw5E++//36XX/fRRx/FiBEjkJSUhDFjxuA///mP+29yFuyOO+7A4MGDkZycrOb3k5/8xP33Rx55BKNGjUJKSoqa12WXXdbl+RBCIh/RKYiyiE5pbWPAYvJo4YNtx1TUQoTIGaONiIUvnTEk0LUsl0wdgKQEa2u0rZ2Ijv78PElOtOHiKf17pD5mk1kHo9//3PEFSlCLscQnO0u7dS4HzWNneH46RhVkRmX6Wq8XOoLd7IvK1DVCugEJWzfXhWdrqQ/t8UGGzC+//HKUl5fjww8/dN93/PhxvPvuu7jmmmtQW1uLBQsWYOnSpVi/fj3OPfdcXHjhhThw4EDAMX/wgx/grLPOCvj31157TQmXn/3sZ9i0aRO++93v4oYbbnDP4ZVXXsFf//pX/OMf/8DOnTvx+uuvY+LEiepva9aswY9//GPcdddd2L59u5rn6aefHsKHQgjpLuSkhbaX9q7RiQ6h4zuPaDsD75m2dum0gUgw08t80alr245WBxXJKKttwtKtx9T1y80oSPsRncCpa8IVM40xlmwucZtPdGdER7//5AQRXQN6JH3tkHnsDMxLdc9nS5Q5rxkKoJdjhw3JaIHDQaFDSMQRcXKPcaarK8hPW8il/L85AiSld/iw3NxcnHfeeXjuuedw9tlnq/tefvll5OfnY86cObBarZg8ubXr9d13362EyptvvombbrrJ75gSZbHZbAFf8/7778c3vvENJYiEW265BZ999pm6X15TRFS/fv0wd+5cJCYmqsjOjBkzUF1drf6Wnp6OCy64AJmZmRgyZAimTp0a6t4hJKpocThR1hj6c2QBKm5mXWFfWR0G5Ka6bYM7gyycbRYLctNbU+SFhhaH6ikiyN906pO/iI48LtR90FX0PAbnpeHA8foumRFI1CMl0YrMlNZ66FAR17Q91VBOaAkJCahvtuPD7VqQDAz4vGF90pGWZFPW3eKkNsq08g7E6+sPq744kwflYEw/47HuaJsfoVPWTkRHR1RkcS8RjDc2HMY3Zg9DuJBmpdIUdFh+upfbnGfERKfu6fS+Zz7dh8VbjiqRLZHEYGuWNh6uQoujVSjKfwl5b5IW1xH62BmUm4bctES8tDa4iI7MUV53aJ80DOnT8W92V4iLiI7DYnxYjOgQQjQSuZEoSlOT8WP23//+F1/72teUyJGIzs9//nOMGzdOOadJ+trWrVvbjejcfvvt+Ne//hXw7/L82bNne90nt+V+HWVqaGjA8OHDceONNyphZbcbBcPz5s1T4kb+du2116q51tdHX7oJIaFw/+KduHt9Aj7cHny6zf2Lt2P2fR9gyZaSTr/up7vKcOb9y3DHm5u7tDg/568f49yHPm7TDV730JFC9/QkW7uua799fbPaB+Iu1t0RHe06JgXlIi5CpbiqAWf9ZRm+9vhnXZrPTf/7Ag9tTsDVT63GFf9YiW/8czUkQDNjSC5G9DUarvpDetqMKwrekOD1Dbrmp1U8taauNYYc0THGMqI6r603xg4XDy3dibP+8hGeX32wTUrk4coGr9Q1LXrEclsEizRDDZY/vrsNlzzyqdrverv00ZW45cUNQT1fG1kMzE3FhAHGfDYFEdFZu78C1z+9Cjc9tx6RJm4iOgKFDiHdQGKaEVnpIlI/U11Tg6zMTCU+gn7tIJFUNEkxWbhwoarB+eSTT1TqmCAiZ8mSJSraMnLkSKSmpqqamObmyKUnDBo0SKWlSS2QvLZEfoYNG4Y33ngDffr0wbp167Bs2TIsXrwYt912m6rnWb16NS2sScyyYne5utxdGrwt7voDhiB4evlezBtf2KnX/cQsHt8Woi2xJ1uKq1UNiSC1EQNzW797dBqT1E3I2fj2ogZ6H3xxqAozh/uvRQk3eh4iIjJTElDTaMfhioYOIyK+SJqUPFdEhozZniBoj83F1e7FstTN6HSsW+aP7vC5ElGRRbOkc1081duC2pf9ZcbJoZOHG9bQgjva5vPZiPDTDV4LstqaEWjEEe72NzerfSAW1TLvcBgx/Oez/e7j/GszW3sIaVvpQXmpygzBay5jC1X9zvoDFbj25CFBifXnTSEl0b0Em0W9tqSjbTD/nwUd0clLU6JTpimucBLt9HXK81fbI595pIkTocMaHUK6DfmmCyJ9rEPEKCDRYYwVrNAJASnq/+pXv6qiI7t27VLmANOmTVN/W7FihUozu+SSS9RtifDs27evS68n0SEZ9/rrr3ffJ7fHjx/vvi2CSgSYbD/84Q8xduxYbNmyBaeddppK6ZC0NtkkeiQC54MPPlDvgZBYQxZZu0yBE0o0QS9IdbPGwWbDxFDQZ/+7UlfhGUGQs9qeQkfX5+j0IS0ApLeOpN7pdDmJ8Eg0pbvrZNxuYlnJKuVIRJu4Z4UidCS1yrOHjAiNM8cUhDwXiYZpwfjSd05EUW7gCI4/dF2ILtAPxlLbMxUtUI2OPs5SE20qKhcISaEUwSG9eHYcrcUJA1ujLJ3lg20l7mNo57FaFe2bOjjX67ibUNT2dVprZIIzA3hv81ElVOU9LPv5mSpCJu975h/eR3F1oxI9Wnj6Q+qidHRJhI40xh3aJx17y+rUPAOZSHi6tcnzIk18pK7piA5rdAghPulrEtF5+umn1XWNuJu9+uqr2LBhA7744gtcffXVbRzafLnzzju9RIwvv/jFL1QTUXFeE7OBBx54QL2GRI8E+dtTTz2ljAr27NmDZ599VgkfifS8/fbb+Nvf/qbms3//fvz73/9W8xFxRkgsIs0gdQG51FgEi+eZ95c70azRaLZopNZUmM5oncGz4Nq3xkWPK0YEQl5akup5Il4p5aaw8RVLhyu7r1DHMyVLIgOd6aWzal+F13M667QlC3rZL1a43PsrFFqd19rv36KPG6knkgW5JlC0Te8jEYO+NTKB+/mEpwhfNzTVPX70bc/X0K/piU4dE3EkJxI6fp2D7jooETlCfkaS2keyKyU1sT1kH0mqnDR0lQauoVh+a2E/qBsiOnEhdOwW46B22LvPFYMQEv2IS1peXp5KGRMxoxERIoYFp5xyioqunHPOOe5oTyBKSkpw8GDghdfFF1+Mhx56SKXDTZgwQbmr/fOf/8SZZ56p/i4RmieeeELV7UyaNEmlsEnamsxP/iaiSOYrkaHHHnsM//vf/9Q4hMQingvj2qbghI5nOlFn+4bI4kxHUSobWjrdd8QrouMTjdGRotx0I7VIFpGygPRdUHsuBn3HiCSttskpKqIjhGpI8LLZ40bMAEKJIviiBUVGohTBBxYUgRhVmKEW2h31b/HsieMpXDztpSVK1aZZaDvpV5rONC4NREl1I5aZRgy3X2RE+9/64oiKSHm+xoQBbYVO/+wUlS4px7ScSGiPg8frsWJXuUrAuGx6a82S7BsdnexI/Or93T8n1f3ZBbsv3Klr3RDRiYvUNacZ0XE5Qi+2I4T0XqT258iRtvVEQ4cOVWlhnkgqmSe+qWzS5yYrq/XHR1LfZPPk+9//vtoCCSHZ2tQpVVfj1FNPVfU5hPQWPBf5waaueZ6Vl1qII1WNWLGrDKe3kyLT3uvKWevqhpY2rmkdIelnnvU9h3z60GgzAs8IhSywpXbBWHC37f8ii0aJSLQXPQgHsgiW+gm9yNc1EqFEdBrswLubDTOIH84ZiT+/t73T0QwtQLJCD+Yo5DiQlLutxdVqfwZKhQrUE0fXkYgbmwhfnW6ojSMkotMRE81ISjgiOq9vKFZGDDOH5uKqmYPxj4/2KGe8dzYV47yJRdhdWtvGiEAjx87E/tmqgansi0kDA9dvvrTWiBLNHpHvlXapoyy7jtV22EjWHZUxo4Ke82pP+MpxzohOhFzXXExdI4QQQnocz0V+sKlr+ux/YVZKp5s1bvap5ZC6mVDZU1qn6hc0vpEEnbrmafHrrzGld1TLjmpREBFGUsVkIS16qk96klsYdLSo9WRduUXZYo8uzMDVJw5W9+0rr0dNY+hrLL0/shI7F1kTgunfEshBTWpQxBbZeExjGwvuUCI6W4tb0zE7gwhvHSmTPj8SCbzcjLbIcS79gmR4iQ4GtrzuOHXM4XThZY+0NV9aIzpBCh0PoaRfX+p0PKOvnkg9k/6br8iKBPEhdMzAlYNmBIQQQkiPIgutbcU1oQsd0xZZFnm64ePiEJs1+qbUdMaQYIs5d13r4SsSdCF5jldEx7vovbqxRZ2pF5KtrpDFRmfRi3kROdKI0y10OljUevJZidVtrSzRMEmZ0gv9kOdjfqadjegIE4NIlwoU0QnkvOY+1tpxXNMMy89QpgXSP0kW+J1lT40hGCUd8PwTitR9l04fqETpZ3uO491NR9V94/tnB4z8jQ9iX3y6u0xFQ7NSEnDOhH5t/q4jNB0ZZBw0jQg8ndMkQqbrdSTK5vd5ZvRQRGcwvXq6SnwIHbNGBw7W6BBCCCE9yd6yWrUo1NQFOPPri+51IgskSRcaX5SFZodTNWsMls3FxpluXVOg08xCQVzKhDljC9z20mItrKk0x8wza3T0nI330OSV2iMiocg8qR2K2Ogs7toTc3GvG69KjYucae+I7UdrcKDOoupiLjHtnGXh3dnULR05yep8v1F3EX57i3st8PxZYLf2OWrqVERHjqWxRZldTl/7/JixJL9gUhHSTREt9S+njTJSM/+5Yl9AIwLf1LFt7USXXjTNDcSO25/Q0BGajoS3WJKrx/ukC7qjSof97ws9bndYS8ed0KHrGiGEENKz6AWpLJaFuhBT1/QZeN340dOVqj2q6lvcZ5MnmTbAXYnonDYqX53Jl5SjIx6uae1HdBq9i8r7ZyEvuTsjOt4pXLKgluhOsIYEr6w3ahrPGtsXfUwR0JVi/NaITudTvnT/FhGc5aZAac+AwRe385rHc/W8+gZRo9MZa2dfJJVrfbnFqwmpRh/nIuo9X8sfw/LTPaJLRj2Pb8NRsZX29zqa1ihfcGYEvulnHR0PWtB7prxFkrgQOi53jQ7NCAghhJCexHORH0rqWms0wlh8fmXKAGXBKxGWTQHOHvuL5siZ5GF90jtlMS2iZqtpRCCF3/qstKdIkMWktpUOFNHRZ/7HFWUiz1x7d0cvHX8pXAODXNhKXdLrGwyhc9m0AX562XQ+opPZhYiO7t/S3uI6UI2Op5jpbETH2+a6c0LnnU1H0ey0YHh+GqYPMXrmaKQxrrip+b5WoOiSHFOBegu9seGI+hxFHAYSTPqYFtOKQDbVorlEWPozFBjfwb7wZ2IQSeJC6NCMgJDI0l7/AhL98PPrvby7qRhn/PlD1S29K5a35/5tBZYeDo8jmF4QzxiSE5Lrmu9iVepD5k8oDNqUQJ9tlwWejraEakZQ3gTVZFEEllgb+zv7fdyvGUGK13vQcxlflIk+OqLTralrHkLHj1jzxwfbjqlUPzEOOG1knzapY+LU5ZnCJ6zdX4Gz/7IMH5qWyb7oCFd2FyI6wdSmtCt0TDGjxY2kfOnIUDCua74mAB19n8pnMO+BjzDhtnfd221vblV/u3TagDb1N+Isd/GUAW5RN6QDS2bP3kK+6P8nEiUKVOcjDVAzzdS5QMdERTOUMUJygrXNPtX7YuexGi/TjjbNQhnRCR9OM3WNER1CwktionGWqbmZ9W+xTH19vdfnSXoPb31ZjP3l9Xjzi7Y26sHy/tYS7C6tw+elXV8yyCJQL0Znmmeu65ocQYltf4t0nX4jZ6o7apLYGknKdtfPhJq6dqjOWByO7peBRCnm1/bM5uJN+p00thiLO8+z8J5mBDJPaeooSJ1Rn+Tu66XjL6LT2kun/df/bE+5upzSx6WMDHz7t4hF846j3ulSD76/Qx07r5puYp7IZ67n05WIjjC20IhiaPtlT7yEiz8zArN4XltKy2NlES+ZlX3SgxM6owszVTRFhGBxVfvNX19YfUB9/pKyqTfZd2k2Fy4x3QR9uXbWECU+RNjr5p6BCJQ6tulwlbov0WZxCyd/qF46HUT5ypssbpHsK5jkPhFL0kzUXz8fdw+dbhI68dFHx2q+TScXY4SEE5vNpnrHlJaWIiUlBRkZGWHrAyE9ZERANTY2qn430TpmLI7rudAQkXPs2DHVlFQ+T9K7KDXTcXxtlUNBp8Acb+x69O9wZYMqepf6nCmDjDPPssiT+gM5cx1cjU7r4nP2yHy10BYXqSVbSnDhZP8LRd+u8jrtJlQzgsOm0JlQlO21WNMiQafCyWJSu7J5ijM5w71633G1+JaIT7+sZHeNjpw9j3QvHc/GmRqdQtRRRElH4gZneB8DMl/Zp9KAUvbxCWb9k3zW0tMl0Ng1TXa3KOyKGYHxHgI3PtWW2kq4ZHQc0dHHmTw22CamUtQ/qiBD9VcSMSEmAv6QpqS6puz3F4zH3HGGoUWL3Y51K5b5jTgJI/pmYPXv5qoISihpdC6P/6/SYFeYP75fh72jRKyIa1qgujH5LhD89S2S40EE/Mo95SpyqfsMtemh002pa/EhdNyua4zoEBJuCgoKsGPHDiQnJ6OszPhRCwfyhdjQ0IDU1LZnjKJpzFgc1xcROf36tbUZJbGPXrxJHYsssjo6G+wP3Z+kxWVBaW0zBuR13gtYn2WWJo9y1ldT3+RoV+iIMDhe1zaiIwtR6ez+tw92qbScQEJHoigSWdALQekD07mIDrw60/uKBG1EIM1CPf/PykI4MyVBpb0t215qzkOK6C3ITTb62siiv6y2OeBiNxz4S+Fy901pJ3VNjh1tFzwwva3YlXolQ+i0CupX1h5SNU2BBIiuiZH9kmTr2vqsvcan+v9AXrp/4aLT0/RJAXfkMMj6HM/0OUPoVKm6Gn+s2ndc2YqnJ9lw1YmDkJZkrE9bWlqwuYPzTMFaMUu0UU4kyAmFI2Z0qanFgdfWHw7YO8eXjqJ8nhEdf8ixLULHOLkwyOuzkP978jEUZVPohD91zUmhQ0i4kR/qmpoanHLKKWEdV774P/74Y5x++ulhS6mKxJixOK4nMi4jOb0XnY4jrk6ywBqabxRtB4vd4VSLN40sfAbkZYTFiEDSnxItLiWg6prt7Z5lbi+d6LLpg5TQkeiBRBEK0tsubeQ9iFgSh7HCrGQlRDpTo6NT13R6UGtEp94roqPH90QiUSJ0dL2KriuRk/TSe0RSnkRsRFLo+E9da+2bEiiitK+8TqVYSUShILW9Gpkqj8hFa92UCDipxdILe8+59M2QfdV+uldH6MhCcVUDWhxOlVbY3nv2RO9viTBJ6qH78UHW52hEQEuKXnuGBHqfiCD33BfhRE4YjDSjS1uOGP93l24rVcKnKDvFbVfdHh1F+Y6bvg2B6mz0iQDffaGFqBzv0qy1O4gLoeNy1+jQjICQSCGL5XAuxmU8u92uUuLCNW4kxozFcUl8IP1pPK2bZdERqtCRKIiOfujF8EldmJOODmmhkGSTtB2jTqc92ksnGtwnDbOG91FnkCWK8P3Th7Z5vl6Aj9dRFLNGR/e8CQZxoapusajoy9h+WV4LPb2Q16lwenzfBbXszz0ekSXNgBxT6Byvx7TB3q5b4ULErna48xRTA1SdheF+JxEpf+ldesE6pl8GbJbjbf6u34s0DRVB+fmecnWsSF2J0+VSx6H0XZFIXjC9bUJFoi+ycJbUwKNVjV4pVRKFbO91ZI4piVYVUROR455XiBGdiR1YTNc0tmDRxmJ1XTe8jRSSLqaETnE1RknamlkjJdHPYNLxOorylTdaAqaueR8P3pFkfUJA1wB1B9a4qtFh6hohhJA4wbPTe2ebGfo+p6sWyJ6GAEKKGUyUiE57dHRW/oqZuqfOQbWw6uh1tfWzWEH7e3x7/XPEmlo3dMxOS1SpV4Is5HUqnKfjmsa3h4unva9nVCVS6H0oaVN6/joCUGjOLZAhgt5/UnvRcf+WutbIxZT+GGxaP/sumvV88kMUFP6QhXRr+lp9SMeOCF+3/XdtY6cjOjqqJVFFfymRb31RrMSURFumDTYcByOFu69PcQ0qmoDlu8vdQicYWiM6De1GdAKlrg3PT1fRPxG4Eg3U6ON7bGYzsPRuYNOriDRxIXRgCh2LkxEdQggh8YFnA8TO9vjQz9EngQ9Vdn4hLtEC7Uile31IREfX6ITquObJeROLlOCQhdTn+4532LtH20uLxqluDG5t0LrYb41K+HaS16lrns1CNZ5zT0uyuXv5hGLxHI40Rn/7sKPXd0fEfN67v/4t4s4mfWG0K57bmc5n0dyRAAmVQFGIjiI6xhy085pEdEKs0TELkTJTEjGkjzEHiaS4kZPsRzfh5dX7OrR2hqMZqDwIHFwNbFsIfPkisOafwMqHgU/+Auz92P167SGCPhnNmHDoedQf2iC1Gzh5eB6GeBxzcDqBHYuBD+8FDq31e0wnNJShcel9wDu/MubTVKvq3SSyKQzBUeDTvwP/vcJ4zOG1an6Sliq9eny/d6qP7sXtCf/C73ddDnxyP7DsPmMeESS+zAgodAghhMQJuthbFtWSltQ5oWMscGcOzcXneytU1KKz6LGG9klTi0KpQUu2tqZVBecWlhywUPuiyf3x388P4OW1R3B2uk+dkbnwdKfMJViVK5q8rggwf8IkUERnfH8foZOXqha2spB3R3QC1OhoZBEoUQiHo+Ni+nALX9/Ikk5BWrO/wu/rS91Oa9+fLBw2vBT8Lq7XHajE35buVOmOowszMHlgdkBHtNaIThLQ1oU4ZLoiqDyd11ojOm33k2Bx2mE5+Blw4FNDeBxeAxSMBxb8WR1fYucuDnXiCIijG4E3bgKKN+BRVw5eTTwdlw25tXWw43uAHe/Btv0dnHtwHRLXB7EjBswATvsZMPpcCWX5fcj4lDK8mnQ7Jjj2A9XAgqRCVOV9E2icANiSgI0vGuKpdJvxhI/uAwbPAk75ETD6PKTXH8IfU/+NrziXIuUTc+38+WOANRHWfjNxe0ImTrNtRvaThpObG3lMn5HACVfgwswC9LEehOvLXUBLphJTv9j+PBIS7IBom/5TjfcRYeJC6LisZq6sM7juy4QQQkiso8XBScPy8NGOUlVjImf1Ay3g2lvgzh9fqIROV3q9+KaPCck2OTtt6bBpaOtiNfDcJXogQue9LSWYNbX1/j1lRp2RpGwN9TijLXU0InR0FKYj9Fl63/QtT0OC42aNjmcPHY1nRMG3K/2AnO6I6ASOivn2A/KkpLoJ5XXNKmozpjADbTvieL8nHRGRz0MiF20EiNRLW2zeduGe6/uqQ8D+lcDAGUDesKDfXyBBJce98b59jp2mWuDQKiCzCEUZ1jYRnX5JTcCBz4CynYYgOb4HCeW7saB0OxK+8DlmjqwDnpyLHxR9FStwDrYfKgM+eB5Y/gBgGmEVWirxfdubwD/fBAaeCDRWAWXb1d/k1d2fiqxZM4uAjAIgOQNITDM2lxPYvsgQVs9fBfQdB8z6ITD6HOOxmi1vIuONH2KCtRrHXRmwwYmh1hJg073Ajv8DElOAOlOtJmUCQ2YBuz8EDqw0tqyBQE0xrnQ55L8mqnJPQPaImcDuD4CKfUg/8iluSPDImBoyGxh5NlD8pRH1Kd8FLLsH3wLwLdH7u83NFB0rHeORc86vMG72Vwy7wQgTF0IHViM2ztQ1Qggh8YIWB4Pz0lQfDmlSKGIjWKEjaWDVjXbVE+aM0fm4e6G4WjWqYvNg+4v4Tf3yWOQnu2t0gjMjaC/9aNLAbIwpzMT2khqsK7PgMp/+LzqKopGoixGF6XhtIOltB8yFetvUtdaFvK416qhGx1fo6DGkvqOz+zfYiI7f1LWcVIyyHEJLSQPgmui1ANWRuBF909u1OJ5QlIWLrctxmm0jKpGJr9lPBDYOwuRGJ75l+winHDwMPFIClG4HUnNxbcsUpFonoSBlPKpcdlhkkfzFs8Cu90VmG4MOOwOYdh0w7kIgof1UMomKZaEWOUc/BZZ/BFvxF5hwrA4Dq0/BBgxrrbkRIbXqcWDtM4bYAPA7iw1XJ/VD4+YROKWuAsOTD6Hf/yravIbFXDi70vrAMux0QDaJTHz+OPDFc5hY/Ao+SF6M2t3ZwE4j2uEceyEu3LEAAxu34/8N2YC+Rz82BJYWCoNnwTFyPj4+CJy64EokZhUEFgC1x4DPHgFWPQmUbgXevMm4v98JwIizgOY6YPWT6q7dKRNxdeX3UI003DNsEy5peRso2wE01wBZA4CTvgdMvx5IyQaqjxj7ZM3TQLUx7y1pM3B35TmYO+0yfOu04UbK3PE9+Py9/2HHlvVo6DcT3/nWd9Vn6aapxhA7G19CY+lebKtwodmahpljBsOVlo+vrR6BVfZR+HTiWd0icuJG6LjcDUNpRkAIISQ+cJ8xz0pRC2tD6FRhzliPs7/toBe40vVdFsI2iwtiwCbNNnUEIhQ8G3b6Cp36DlPXOk4/kuiB9Aj5fwu3YslhK+pf+BIWqwU7S2rbvK6QE4LF9FZTpOUkudpYR+tIgmc0xJ9VtndEpzWqJRRmpajeJ9JNvqS6MWDDSX9U1bfg4WW7VO3HyAI/NTQtjWqBm3NkFUZZHBiQ2r+1zuPol8Dm13DhF6/giuQDkJILPPA7YwEvW9FklG7fjZOtO3F2ZgYs2yuRaDf2pxcNFRj/6Y/xYNKbrfd9tEhdSHBtqgS4ZDcbztpAfRnOwfs4J+l9OF9/GC2WJCRs8AjrSLRC0qr2fmRsspiWxbzMWyIbskmWjqzr5CS204F59dW4IOUQUAngfSNKMhLAg3gPdyWnwbZiLrA6AdjyhtjwGq8jkZOmWtiaazDKehioPmyoGY0IgvzRQJ8RQN5w2LOH4KONh3D6JTcgMcnjWLzkUWDq12F/62b0Kd+OPs4aVNty8WLBT/BR3SnYXF+GkozTkPPt24G6EmDb28Z7GjkXSM2Bs6UF1eWLgLS89gWARG7m3gHM/imw5injvRR/YaTIyaY55UdYbLsGJUv2qJsD5/0AGPp7YP9yoLneiMDYPKKOWf2NcU/7ObB7KZA7DG9sSMTKj/ZgjI7iyrz6jMCSrEvwpH0qrh802FvkCMmZwOSvGVuLA5fe/p4S7isXnKXq4Vat/ECdOJHjvbuIE6GT6M6rJIQQQuIBz8aHSTYrXt9wJKQ6Hc8Cfokw5CYBZU2Gq1WoQkd6m4gbl6CLlAVdoyNW2EG9lw4K1y+ZOgB/fm87KpudWGgWxGumDfFelOmoSzBNQ1fsMpohD85wBS6CP16v6n4C9dHpn2P0Dkm2WTGq0OxF5HTA6mxR+1fEjfQ6kkhaKELnoaU78fSKvThQXo/HrhwLHFoN697lOHHPUiQ8cjtQuV8Jg+8C+K7svhXSuTIdSEoH6gzlIa/W6EpUa/zkmmLgyxeMDcDXZJO3Iyf6XwbOsSTCYlkOnPwdI5oh6V2vfBu2qoOww4Z/2edj/sT+GJRQBdSWwFlXhiVH07HZORTf+9rFSBs0BS2lu/Hsvx7BPNtaDHSUIRlNcKUXwDL1GmDqtYawqDwArH/W2ESASD1MO+gj44CzLwaMnwUUTsSBLz9B5vEvkG+pBnZ6iLChpxlpX6POUQv4T9d9icdeWYjxCcWocCTjUMIQ/PfW64xohweulhbU7lwEWPzUxgydjYQfrMCD9/0KKQ0leKzxQlTuFeFZ5nY8U/19soqAE29El0jNMepbZKstBfYsM1LLJBojkZqx52OGmHIs2YP+aS5VK6XqeUS8trsTM4DxX1FXB+7f7zcVcP2BSnetXXtI9G9k3wwVYd18uNrtTijHdiQilmEROvfeey9effVVbNu2TXXqlgaBf/zjHzFmzJh2n/fSSy/h97//Pfbt24dRo0ap5yxYsADdhlvoMHWNEEJIfOBO98pKdhe7d07omJbMKS6UNVnUgv7k4X1CmovUScjJeIlaeLpZBZO6JrVCrWYE7Z8Jlh4wz35zBp5fvBLjJ0yAzSzWlgjLBZP6ez1WixHd+yYQckb65bVGOs/UPv6EjrFvJc1Pvw9/ZgSZCU68cnk+squ2IXnpbcDhdUgo/gLntzTClbwao3Pm48BxQzCdOCyvNRojZ+1rjgBJGcYmi1EpKG+sRktDJXLWrcPvEipw8p7dwH17VJRDdmuR54un5GB/cyayHBXItdQCLXXGlpAKjJoHTLgYNyzLxrpDNbh/VhMuzNhpRFKO78XRBgtqHEko6puHdDTAJjUYXz5nbIUTgWNbjAhL7jCUz38EYxNHY5AU4pvIJ3Dr3UuU6cM5fU7FhJxslCIfd9rrcI/remz+bhFWf/weTrzsJ0hM8Vg85wwG5vwGOONXwL7lRl2JCAzPTaISUp5gTYDLloTZTx3BkeZULD37DAzOScb7JWNxb7EVJyXtxf/OqDRSu6ZcrSJVnmT1G4qPnZPxcbNx/7Dc9DYiJyhsibjgxjuxfGcZfupxtzQHlSahESGjLzDpcmPzYObQPDx9/TQc3LgqsMtbiOYOe0prsfZAJSxwYd64jiPDcpJECZ0j1apfkzFu9/XQCVnofPTRR/jhD3+ImTNnqiZ2v/nNbzB//nxs2bIF6en+m5B9+umnuOqqq5RIuuCCC/Dcc8/h4osvxrp16zBx4kR0B0xdI4QQEs8RHb0Yl4iBdEjPTk0MOdWsj6lPOtPrxbNnimedjGFGIM0qA/8+i2GA9B9R7yUIK+Ipg3JwpMiFBScPbrfRbq5pGNBRREeiOUeqGjE95QimZrdNDZOeNH3Sk1TBvogiqS/Jaz4ErF8FHPwcKN+jirglKnGCrj0xkT2h9saqx/BAwov4nfUqHDw+UqWCqXqJzx5zR138Ie/gx9CFI+aWNQDOwbOwuSIF4874KhKKJqqUp0v/8D7K6pvxzg9mYFx6LVBfbriFiXACcFH9Aaw8tBEP7c7DBTdfCYvl9yot7uS7Fqu/f/Gt+bAnuLDypb/h1OStsIoAK9lkTGTSlcCC+1GYkoXCAItmETpy7Ihw1iI8PyMFlqITUJZ50DuVyhMRMsPPaPcz0vsyM/djoKRGiUUROtWS1QYrjmZNAs4+M+BzfVMiu9LEVNIH/aYQ9gCnjczHoh2de66nuYOcbBCx9JIp+MfluIJKP5N6vFfXH1bfJdI41hg39LTXbhM67777rtftZ555BgUFBVi7di1OP91/OOyhhx7Cueeei1/84hfq9t13340lS5bg//7v//DYY4+hWzCFjpVChxBCSBwglsrlda2ND6UeRdLNpNhdnNRmjejToTARty05EWykmrmQl+xqt1t6Zxy/3BGddvro6EWxdLBP1Y13woCuo1Gua7pmxc+Z7xfWHMSPba/iFrwM++YkWC0fGEXcQ04xHu+w4/TMI8hsXIsZ1h040boNGf9oW8iuSEwH+o4GBkwH+k9DS+FkrFn6Gk6ueBVZx/fgb0kP4+DaJcCqw0bERRAXrGGnGdGI5lrDLUz6rSRnYk2JE3trbKiGpIYNwdVXXIUZkyfDYbdjz6JFGCupSomJ5vFgCLr83Bwgs9BID/PggklFuOutLdh1rFbZRE8fkusWu7I4leaoYglekTEKjgU/gfXc+4z0tpxB7nSnQAzMS8MXh6rczTzD3UNHI/OUCILhDpiLmmZLUMJF0hjlo9SHQVeETm9hgJk+KVFKiXpmpSTgFVPonFwQXJNdHQ2WiE6GmbqmUz1jokanqsr4D5CXZ4ZY/bBy5UrccsstXvedc845eP311wM+p6mpSW2a6mojfC7/wWQLFZel1XWtM8/3hx4nXOPF4rixNNdIjcu5xta4sTTXSI7bmTmQ2EJsjmXRJsGTPunJ7siMCB1ZvHYkdPQCV5paSsRCjoM+5gncQ53o9dLaw8VH6ARRoxNsfU5IuFwYZD+A62zv4YLDO4A/bgEyCoGvPQfkj3I/TKI9mVtewC2JL6vbCa5mYOMLxpY3HMjsr6yF/9pSb4RXPFPmRcyIda9ETXKHAblDgfR8bzHV0oJjWZNgv+xm7HzzTxi25VEMajRPwRdMAGb/BJj4Vb/RjuKqBlxx3weqyFssr8X+emx1Jmb4EWtltc3qeJDaCH+OcIL0NlpwQhFeWXcIL605aAodM32xKNt/ytQpputXB+h0JR0N1KmI4RYUnlbfQpX59dXR60iDS/l/oq2owy3AYpGURJvaD3KiQQSqnDiR63npiZiQG1zgQDssqu+dw8axpKPLUS90nE4nfvrTn2L27NntpqAdPXoUhYXegUy5LfcHQtLc7rzzzjb3L168GGlpoSvBxnKjS3JTQy0WLTJcQMKFRKciQSyNG0tzjdS4nGtsjRtLc43kuMFQXx+5vh4kcmhxIDUruvBXzq4u3lLi7o3THu4F7oDWBW4fM6JzKBIRnXZS17yspe3NRrqU1GvUlSn3LqlVUXUmg0/2P4DUd2x8yXz8caDhuCqSP6OhAmeIftDnVcVq+MmzgSufdRdtr176Eu62PaGuO2b9GCvKc3Bq2h5Yt7zu7q2inmrLwGfNI7DWOQrFOdNw/0+/CSSGsKBLSEbDyTdj7vrhuDF9Ob7xta8Zzljt1Fa8uu6wEjknDs3D6aPzldAJVIPlPh7Sk9otBBfnNhE6b31xBLddON6vU15naG2I6h3RadPbpovo19FiXEd0ghEucny19tyh0NHpa/L/TwSqHBPCxZP7I8FlNsbpAEmRlSib1PlIpE2PGRNCR2p1Nm3ahOXLl4d3RlK0duutXlEgiegMGjRI1QNlZYX+n235i9tVMyopBguXCYKc3ZLFx7x589rNAe7N48bSXCM1LucaW+PG0lwjOW4o6Ig6iS38RVAmDsgK2pBAiyHPBW6eOVRxdSOa7U7lIBb8fLSZgH+hU9+OGYEsikdbDuK7Da8CD1xj1Jb48sn9wJSvA/PuApLMOcvjPrhT9Tfxh9OWjBXNo7AhYTJ+dN3XgKV3G/1N/nMJcMGDqmD91HU/Q6LFgd1FCzB4zu9Q8c67cCz4MawL/gRsWwTYG1Tzx1f2JOO3r29R456UlReayDGRBeFh9MVd9ZfgmuFnIbEdkSM1Ey+uOaiui6W21D6199m6zRx0L5kAiAmCuGntK6/Hoo1HPQRv14ROa72HjuhERlD4Wn1LjU6wryPH5tZifb377I+jmUG5qVi7vwJfHKrE+1tL1H2XTuuPXWuDEzo6GuhpaBDVZgSam266CW+//TY+/vhjDBw4sN3H9uvXDyUlxs7RyG25PxDJyclq80V+6DvzY29JMMK0VjjDvljo7Jx607ixNNdIjcu5xta4sTTXSI4b7GuT2MNfupfOl99VWovGFke7zR/9ncnPTJR0FqsyBjhS2YCh+f5NiEKK6FhdralrDrvR0LD2qBF5UVs5zlvzJr6VvMXojyKk5hmOXJIGlpYP2MWZ7HVgw7Oqc7zl7DswqHwjEh77qRG9kTJ1sS0WK2R5rvQqSeuD0qTBuPZPy2G1Az8cchqs178FvPEDYNMrqhGjIzEdaWjASucEjLv6CW9LYbFm9nC5GlhpdpoP0Cw0GMQ0IjnBiia7E8WVjRjcjn3vqr3Hsb+8HulJNpw/qQi1jXa3K1ZDswMJlsDGFO1h9CIapCy6/7NyH3aX6h5EnXAg8+fgZRa2R6xGx8PqW6huDl64eB6bjOh4pwI++9l+2J0uTB6Uo/pq7ULwyAmWdzcbWVzy/ZGf0bn/H90idOTg/NGPfoTXXnsNy5Ytw7Bhwzp8zqxZs7B06VKV5qaRM5Ryf3dhMXNbaUZACCEkHiitaW6zkCzMSna7g20/WqMWLf6oaWxRZ/R9F7gSYJAC5d2lderMfChCR0eYVKqSWCZLyllVMcY1rMavE/bhxNo9wH17Aal18UFMeVtcNhzsewaGz/8eMEKaHfosXw6uAt76KXBsMxLe/jGm6fulzuXCh4BBM9uMm2M3okiS/lXTaEd2Wgpw6VNAn5HAR3+EraUO250D8eqo+/DnzIx269X0Ql6N68daOhhEZEjqlexfEQTtCZ0X1xhF4WJZLNkqsklUR1Kvth6txglFZp+eNg1XO17wf3XaAPxl8XZlHiDIwrSrgkT3BZLInbivRSqiM9B09JLieXHrq24JzoxA8HyPrNGBl0OajrhKamOoeH6HiHDqjNV1twkdSVcTe+g33ngDmZmZ7jqb7Oxs1VdHuO666zBgwABVZyP85Cc/wRlnnIG//OUvOP/88/H8889jzZo1ePzxx9FdWMwvRKuLQocQQkjvp1VYtC7YZIEhxcGf7CxTKUmBhM7WYiOXvig7pU10YqApdDp0XmtpAIq/BMq2A+W7cHPZShQlHcbw1ysBu+EmJqcgF3haI4uOSMo0ojUSdZGu62l5+M/uVDx4dBJ+M+t0DB8dYKE16ETgux8Bnz0K17J7leuYZc6vYZv944C2xckJNtXgUxbEx+ublauYUnNzfoPmPmOx8NV/4Y/Nl+JPJ43r2KHKQ+hIsXZXUq/U/jUjEoGE6KKNRo6VRF80En37aEep+mx9hU4ohg5F2ak4fXRfLNtuRKnG98/u8uJUoocitMXJT0RyWYQiOlkpiaouRCzUD1c0eER0gqvR0VDotE0zk2hMZ3oBeUaFPU8IRKXQefTRR9XlmWd6e5H/85//xDe+8Q11/cCBA7CaDboEaSoq4uh3v/ud6rsjDUPFca27eugodESHQocQQkgcEOgMvpxdNYSOcbbeH+0VoPsWlbuRvi873gMOrQYOrTEMAzyyKFRpvywN9F3WRLjS+uC4PQXv1Q7HFxiJ+378TVjyxxgd3D3474Mfoxw1HS/S5bd+9o9hP+FrWLJkMebNuhK2QL1ZTHLSEg2hU9eMYR4RqnddJ+PmxmT0z07BbI/ml4EQ0aQX8roRaWfQ+/eDbceQaPNfA7XxcBUaWhwY0Tcd0wbntBE6W+Tzm96/UzU6mitnDHILna4aEXgummX/SC+niDjp6dfJS0XVYSMqWWceb8FFdIz/K9LUtiufYW9ioIfQWTCxSAnJUJ04C7JS3NHG7raW7lTqWkdISpsvl19+udp6CqvYPFLoEEIIiRPETtjfAk8vWtszJNB/kzP5AV2tdNNQaYT52aPAuv+09n3RiF1z4QQ0ZQ/HHz5vwV5XEZ788VeRnF2ous5L4/H331yE36w2liJ35o5Gio/I8RJtQS7SJRLUkhBcw0aJWMl7qZReOh5oh6lLpw9s16XMkyF56Wohr40BOoOMIYg7nmztceXMQV6RFs+eJb5IPU8okYqzxxWqfSMCcGIX63M8o1Vr9ldg05EqNDs8GsC6jOvhQgTVpsPVKvXOBYthqR2EcOmXnezeR55NbeOZopwUJNosaHG4vKKHoSJ1OiKch7STjhmVfXRiBXeNjiuwqwshhBDS+yI6/oXOtqPVcDhdfhfxbqctnzP5NkcTRieVYpplBwYWbwJefBDY+mbrQrXvWGDkXKN/zMCZQPZAlQp28FgN/v3px6rhYHK/MV5jevb/FEMCX4MEcXeTxbYavgsCIhD6zL1+Dc2XhwzngzPH9A16rJ/OHYU3vziCs8YVdHo+F08doIRAZX37Z81FTF190pAAn20NWkwhIWwtrlb3yYJ15tDAfQ89EUe9+y+fpKJ/88Z7twjpLFokr99v7FtJMZNIWEtLeIWO+3UOGq+Tn54UlHCZMigX3zhlqOofRAwkqviHi09QEcGThwd37Pjjx2ePUv9/vzJlALqbOBE6xtu0MaJDCCGklyPJF4H6gQyVBqBJNtXtXBy6RhV6Rz6a7A7sLKlBDmowvWk18MGXwOE1SDi8Dhc0GgvHs2VI0UKGmzIw4ixg1k3GpZ9ajkCOa4KsP1MTrWhocaqCZ982ptKkMJLpRLlSl6OK11uFjuw7iczIWxnbL/i0rVNG5qutK8g+euhrUzv13MF5ae6aoz2lrdG1l0zjgrnjClVfpWA5a2yh2sJd7yFWxZGsg9EW0xvNBpXBpseJ6L/jogkRmVMsc8XMzkdyNNMG56qtJ4gLoWNNML7IbO7kYEIIIaR30uiAsoD2t8iTM9vjirJUCtHOvfsxqvKg4VhWvhOoLVVOaBsSS5BhaQTebH2eli+uhBQcbM5EKXIwedosJJz8XaDfxCB7+vh3/BLHsIaWZr9NQ7VIkghGJNKJck2zBXHp8o1oSc1OenLsLJNk/4wvysKqfcexpbgGyWZE7LX1htC5ogupR+F0RBP77EhaOGtBpV+nu+2MSXQRO/+Dw5C6ZmPqGiGEkF6ObpIoZ/dFRHhRugO/tj+KvKRVGP6u4ZzqiSw9k7We6DMKGDhDbS2FU7B4zS7MO/8SnH/PMtQ02fH+KadjZEHHtTBarASqsUlLsqG8zuyl40NpqPU5IaKjRBUeqWutZgzhqU3pTqSxpyF0qiFxoaXbjikRJ0YJp43qWrSpq/g2ioxcRMfb2YsOavFNXAgdq1voMKJDCCGkd1PdbGm7wCvfrXrDYONLmCE1NbrmX1zOpMdMv0nKPOCpDbX4z6ZGnD9rMn5xkUfvmZYW2G2HYbFalZWy1HxIt/NghI7b6jpA2pSk0gl1TW1PRrr7rUSgPsc7ouMhdMyUp3C5jXUnWpxJRGdqEfDKOtNUYdpAJARwcesuxK5c0sOkNiySEZ0BOd6CqivmECT2iavUNSsY0SGEENK7qTEjOmohWXkAWPZH4Iv/AWZWQ/WQc/DjnZOwK2kcPvnhV72cuxZ+tAL7XJUYNah/uzUQSuh01EvH5Fh1+9bGOj2svrn7IzrajauiriUoe+1oR89ZhE5FHvDJrrKoSFsTRGiJ2NGOfcE0L+0MqUk2t52x8TpMXYtnelbedxMWXaPD1DVCCCG9nKpmIAP1+Fbjv4G/zwA2PGuInFHnAN9ZhpRrn8cKyzQcamxddApypl03C21vka9TkDyfG2rzUt/UtcARncbIRnRMMwJpGKqbcUr/lVhNXRtZkKEc08SQ4J2DVkjw5MRheRjq0SMoWtLXIhXR8U1fY0QnvokLoWO1GWo+gWYEhBBCejNOO6bXLMWy5Fswv+I5wNEEDD0N+Nb7wDUvAv2nqoXwKDPlzLPnyt6yOtWIUjqgD++bEfAlAjYN7ahGJ6AZgSl02ono9M1KiWjqmu6jo4WeRB6kj0ws2gGPMZ30VpVaoiaa43vsRLp2xrMxJWt04pu4EDo2M6KTwNQ1QgghvZWDq5Hw5BxcW/8M8i3VqEwdAnztf8D1bxl1OP5SnMw0Lc+ULbFUbq9JprbvDTZ1rcOIjpm61hM1OlrMSMG+NEWP5bQ1jZ67NMuU+qcFJ/RDtKCPnYhHdDwEVT5T1+Iaa1yZETCiQwghpLfRWA0s/Dnw1DxYSreiGhm4reV6fHDWG8DYBX572+jFsGdEZ4t5XbqYB5MWFEzqmvTl0c0vA51ZzzAjOj1Ro5Njpq5J2l51o929P8bHYNqaxlOknX9Cv7bOez2IZ0pZpGp02ggqpq7FNdFz9HeDGUECnEYnNT9f+oQQQkjMsf0d4O1bgBrDXct5wpW4YuMcbHNkYW524PSzCQOy2wgdfb2j2hSdFiQCRmpaMlOM31h/aKGSZLMiO9X/4/RC3DeiIxGWjhzbukpygs3dQFUsplv3QexGdDxF2mXTur8TfTA1OpI+mZWaEPHXSbW5kJJoCGkSn8RFRMeW4BG2dDKqQwghvZGHH34YQ4cORUpKCk466SSsWrWq3cc/+OCDGDNmDFJTUzFo0CDcfPPNaGw0it9jgrXPAP/7miFycocC174Ox0UP46A9s8MoiDQNlXN+R6sbUV7bFFLalvTn0UX8YjHdHu4am8xkL3c3/2YE3r/P1Q121fBSPz9S6DqdkupG7CwxanQmmkIwFpGI3PTBOTgh14kpg6LrfYiIHl2YgQsmFQU8HsLB5EHZGNYnDVPzDStrEr/EidDxOIvkaLWQJIQQ0jt44YUXcMstt+D222/HunXrMHnyZJxzzjk4duyY38c/99xz+PWvf60ev3XrVjz11FNqjN/85jeICbYtAt6+2bg+89vA91cCI+YoYVBnt3QYBRGxMrSP4cQlUYziqkZVpyK1OaPNYvZgUoMOdVCno2ts8tsRKunJ/s0ItONaVkpCRM/K66ahn+89DrvTpdLZ+mdHLq0q0kiU6vkbT8S3xzojKiY6a/383k9PxwNXTIno60iU8b2fzMaVww2hTOKX+BM6TgodQgjpbTzwwAO48cYbccMNN2D8+PF47LHHkJaWhqefftrv4z/99FPMnj0bV199tYoCzZ8/H1dddVWHUaCo4OAq4OVvAtL4c+rXgQX3A0mG8CivM9zDEqwW9wI+EOM96nR0ytaogoygRIVODTrYQZ2Ou8amHaGjU9fqmx0B6nMiKzp0RGf5zjJ3RCvaBEJvorv2LT9DEkc1Oh5f9g6mrhFCSG+iubkZa9euxa233uq+z2q1Yu7cuVi5cqXf55xyyil49tlnlbA58cQTsWfPHixatAjXXnut38c3NTWpTVNdbQiDlpYWtYWKfk7Izy3biYTnroDF3gDniLlwnPNnwN76u1ZcUacu+6QnweGww9GO2ei4wgwsBLDpUCUamox5jOuX4XdOvvMtyjaEy/6y2nbfw9FKI+LTJz2xzeP0bTOgg9pG7315xHxu34ykkPZTqPs2O8WYwLoDFepybGFw+yAcRGLMWBuXc42tcVsiNNfOzqMj4kLoJCYmwOmywGpxweVsATU+IYT0HsrKyuBwOFBYWOh1v9zetm2b3+dIJEeed+qpp6r6FLvdju9973sBU9fuvfde3HnnnW3uX7x4sYocdZYlS5YE/djklkqcvuMuJDZXoCJtOFakXwnHe97P33hcfuFsSHI2KuHWHrWVxmNX7yrGgcNSy2AFKg9h0aKDHc636qjx3HXb92GRZU/Ax6/bLYkjVlQW78eiRfv8Pmb75i/VWEdKj3vN+ZMjxms0V5d1+F7am2tHVB0z5ihpa0JziYje3V0eNxQiMWasjcu5xta4SyI012Cprw/O3j4uhI7kHNthRRIccNpbQP8NQgiJb5YtW4Z77rkHjzzyiDIu2LVrF37yk5/g7rvvxu9///s2j5dokdQAeUZ0xMBAUt6ysrI6dTZSFgrz5s1DYmJg1zJPbK9/F9bmMrjyhiPjukU4Jz2/zWMqPtsPbN+OkQPysWDB9HbHO6m2CY9t/QilTRY4bBKhacalZ52Ek4bldTjfjJ1leGnvOrQkZWHBglMCvsYbz64HjpVi9rQTsGDmQL9jnnrSDDy+bT0SU9KxYMGp7r9/+e52YP9+TBkzDAvOHRPUPvI3147Y8+FufHy0Vdhcfd5pGFmQEZbPLNxz7Y3jcq6xNW5LhOYaKjqq3hFxIXQkV9mOBCV07PZmCh1CCOlF5Ofnw2azoaSkxOt+ud2vn/9miSJmJE3t29/+trp9wgknoK6uDt/5znfw29/+VqW+eZKcnKw2X+SHvis/9kE/v7oY2PqGumq59Ckk5hT5fdjxeru7rqWjcfvlJqIwKxkl1U3u2p5Jg/PafZ6e79C+me5eOgkJCQHrIfS4/XLSAo6blWbs1/oWh9djyuqM1JTC7NRO7eNg922+Rz+X1EQbRhfltNswtaufeXeNGWvjcq6xNW5ihOYayusHQ1yYESRYrbCb8sZpN750CSGE9A6SkpIwffp0LF261H2f0+lUt2fNmhUw7cFXzIhYEiSVLepY87TRHmHwLGDAtIAPC7XvjGfPnMF5achqpyeOJwNyjMaPqv+M2RC0Pde1giBc1+p9+ui0Ghl0jxmBMLYos12RQwiJLeJC6MiXlk5Ys/dw8RQhhJDwI2llTzzxBP71r38pu+jvf//7KkIjLmzCdddd52VWcOGFF+LRRx/F888/j71796pUDInyyP1a8EQN9iZg7T+N6yd9t92HlgZh5+yJZ8+cUJpkijObFi+BLKadThfKtPAKwnVN7KU9RaYWSZHsoSPkebjTxXKjUEJIXKeu6YgOhQ4hhPQ2rrzySpSWluK2227D0aNHMWXKFLz77rtug4IDBw54RXB+97vfqXQruTx8+DD69u2rRM4f/vAHRB2bXwPqSoGsAcDYC9p9aGmtkbVQkBFZoaN76YgYkaahkwbmtPl7ZUMLWhyGcMlvZz7pZsNQ8QJobHGqXivqvQQRDQoHOV5CJ7oabBJCukZcCB2rh9BxOJi6RgghvZGbbrpJbYHMBzyRuhJpFipbNNDY4sAvXv4SZ4zui8umexTtS4Tjs0fV1cOjrsbNT65BU0tgz+itR2vUZX5m+z10/C3sQ13kD8xNxdr9FTgYIKKjhUpuWiKSEgInkEhdjEaiOiJ0ZH9UNbR0T0THI3WNER1CehdxIXQEt9Bh6hohhJAoY/2BSrz1xRF8vqfcW+gcWg0UbwBsyXioYjZW7T3e4ViJFheG9kkLWqwMz09XtT1TBrWNygTVNPS4f6FzrKYxqBobORmZlmRTDUPrmuwq+qNT3pJsVmSnRrbguU9GkhJjEuEbXWiYLBBCegdxI3QcptBx0YyAEEJIlNHscKpLSQWTSIg7ivH5Y8blpMvx+Q7j6q/OHYvRhW3tjwW7w4EDm1Yj1yMdqz1kcf/i92ahye70KsoPhkF5qW7ntfYiOsFEZKROxxA6jjb1OZHucJ9os+LtH5+meuxJ7REhpPcQN0KnNXWNER1CCCHRhcNpCB1h85EqnDmmAKg+AmwxLKVrp3wL+1cWq+tfmzkooCiRHhft9Lr0S3v1M0FFdAKkrgXjuKbJSLahrBaob7aHLJLCgXaRI4T0LuLCdU2QPjoCzQgIIYREG3azaF/YfKTa21J6yGxsdgxRd/XPTgk58hIpBppCRyI64rDW1YiOtqvuTsc1QkjvJm6EjsN8qxQ6hBBCog2Hh1DYooXOhueMyxO/4xY/46PIFawoJwXScqbZ7nT37/EkFLGie+lIjU53Oq4RQno31rir0WHqGiGEkCjD7iF0JHUNTTVA9WHjjhFnuYVONLmCSW1LUbau02mbvlZqmhEEJ3QSfIRO8M8lhBDEu9DRqWsOmhEQQgiJ4ojOvvJ61B3dadxI6wOkZBniJ8qEjnZtE6SXTuAanfZd14R0M3VNDAnUc6uDfy4hhCDehY7DwogOIYSQ6I/oCEf2bjWu5A1Hk92BXcdq1c0JA6IndU03DQ1kMe1OP8sKpkbHTF3TZgRmKhxT1wghXSEOU9eML1FCCCEkGl3XhKpD240rucOw42itEkI5aYnKjCCa0M5rvhbT0vCzptHe6dQ1HdFh6hohpCvEndBxMqJDCCEkyiM69vI9xpW8YV5pa5HuKRMqupeOr8W0FiopiVZkmiImODMCh3Jw0w1Dg4kGEUJIIOJO6DB1jRBCSLTW6IgwUJc1+40/5A33MCKIrrQ1T4tpX6FTWttqJhCMONP20tJHp6K+2S38+qRT6BBCOk/c1eiAQocQQkiU0WL20dFipm/LEeMPud4RnWhDR3SOVDbC7mhNv9tZYtQU9csKLtUu3V2j43DX5+SlJyEpIW6WKYSQCBB/qWvso0MIISRKa3QG56UhPwUoQrlxf85QbC2uiVqhU5iZgkSbRUWkjlYbURzhlXWH1OWcsQVBjZPmUaPjrs/JYDSHENI14kjomDnC0mWaEEIIiSJ0qlaC1YIzCuphtbjQYkvD3oY0NLQ4kJpow7D8DEQbVqsFA3K8Lab3lNZi9b4K1Uz00mkDgxonwxQ69U2OkNzaCCGkPeJG6DgtxltljQ4hhJBow2GmriXYLJiZbaSqlSX2x+Zioz5nXFEmbKIcohC3xbRZp/PSWiOac+aYAhQGmbrmaS+t++8wokMI6SrxI3TM1DXW6BBCCInWiI6ImfHJZer6PldBVBsR+BoSiMW01Om8YgqdK2YEF83xtJeWhqE6otOXER1CSBeJPzMCJ4UOIYSQ6HRdS7BaMchSoq5vaeiDjYei14jA15Dg0PF6fLSjVEVkxEjgrLGFQY+Rbrqu1UqNTo3p2MaIDiGki8SN0HG6hQ5rdAghhERvjU5O42F1fZejAKv2HY+ZiI6krr245qC6fsnUASE5puk+OvVNdo8anehqjkoIiT067uLVy1LXXA4KHUIIIdHpumazWWA5bjQL3e8qVJEeET+j+0WfEYFmUK4R0dl+tEalnglXzBgU0hjuPjotDtboEELCRkK8RXQsTF0jhBASpRGdRIsTqDSahR5wGalfIwsykJxgZiVEsRlBdaNxInHyoByM6ZcZ0hg6ouNySa2PYWpA1zVCSFdh6hohhBASJTU62fZywNEMhyUBR1x9oj5tTeiTnqTsrzWhmBBo5PkWi3fz1L6ZFDqEkK5hjbfUNUZ0CCGERGtEp0+TUZ9jzxoMp/kTHc1GBILFYsFAM30tOcGKCyf379QY6Wb6mpCSaEWm6cRGCCGdJX6EjsX8wmSNDiGEkChDbJmF3CajmD8hf7i7b060Cx3P9LUFJxQhKyWxU2PoXjpCQWaKEj+EENIV4q9Gx0WhQwghJDojOtpxzdZnOH581ijsPFaDaUNyEe1cO2sIahvtuOmskZ0eQ/XS0UYETFsjhISBuBE6LosRvLKwRocQQki01ug0Gs02kTccPzl5FGKFOWMK1NYVtCGBUEChQwgJA3GXusYaHUIIIdEa0cluMFLXkDsM8Ya2mBYY0SGEhIO4ETout700IzqEEEKiC4dyGnMhs15HdOJP6KR71ehQ6BBCuo413mp0rKzRIYQQEoURnTzUIMlRJ6fkgJwhiDfSPFzWGNEhhISDuBE6jOgQQgiJVhxOJ4Zajho3sgYAiSmINzI8UtfEdY0QQrqKNe7MCBjRIYQQEoURncGWY3GbtiakeZgRMKJDCAkHcSR0mLpGCCEkel3XhlhK4lropHtFdCh0CCFdJ+5c16xMXSOEEBKNER1rSdw6rrn76EjmhQXIS0/q6ekQQnoBcSN0GNEhhBASzRGdofEe0TFT1/qkJyPBFjfLE0JIBImfbxK30HH09EwIIYQQL+wOJwZb4juio/vosD6HEBIu4kfoWI23yogOIYSQaCPRUYe+luq4juiMK8qEzWrBjCG5PT0VQkgvobXyr5fjMmt0bBQ6hBBCooyClmJ12ZKch8SUbMQjE/pnY+3v5iI7NbGnp0II6SXEXY2OjalrhBBCoox0pxHNaUnNRzyTk5YEi7gREEJIGIgfoWM1hQ4Y0SGEEBJd6GbWLhvdxgghJFzEjdChGQEhhJBoxeJsMa+0Ns0khBDSNeIwdY0RHUIIIdGFu8ebjfUphBASLuJG6MCdusaIDiGEkOjCok/CWSl0CCEkXMSN0LHAEDqJUqPjcvX0dAghhBA3jOgQQkj4iTszAuOGsyenQgghhPiP6NjipusDIYREnLgROhZPoeMwiz4JIYSQKEA3s7YwdY0QQsJG3AgdWDzeqna3IYQQQqJI6DCiQwghPSh0Pv74Y1x44YXo37+/aur1+uuvt/v4ZcuWqcf5bkePHkW3wogOIYSQKK/RsbBGhxBCek7o1NXVYfLkyXj44YdDet727dtRXFzs3goKCtCdWDx7E+iiT0IIIaSHcblcsJg93ih0CCEkfIQcIz/vvPPUFioibHJyctBTWK0WtLhsSLQ4KHQIIYREDU6XOIJS6BBCSLjptmTgKVOmoKmpCRMnTsQdd9yB2bNnB3ysPE42TXV1tbpsaWlRW6jIc2wWwA6b+jFpaWqQOzv5TlrH9LwMF7E0bizNNVLjcq6xNW4szTWS43ZmDiRy2J1OJEjrAwodQgiJLaFTVFSExx57DDNmzFDi5cknn8SZZ56Jzz//HNOmTfP7nHvvvRd33nlnm/sXL16MtLS0Ts3Dagod4aMP3kddSj+EgyVLloRlnFgeN5bmGqlxOdfYGjeW5hrJcYOhvr6+x147XnA4XUiQbAMKHUIIiS2hM2bMGLVpTjnlFOzevRt//etf8Z///Mfvc2699VbccsstXhGdQYMGYf78+cjKyurUGcnn31riFjpnnDYb6Ns6p84gY8riY968eUhMDN8PUyyNG0tzjdS4nGtsjRtLc43kuKGgI+okctidLo/UNbquEUJIuOiRb9QTTzwRy5cvD/j35ORktfkiP/Sd/bH3jOgkWiUhOjyLhq7MqbeMG0tzjdS4nGtsjRtLc43kuMG+NoksDocLCabQsdqSeno6hBDSa+iRPjobNmxQKW3didTotJhCh2YEhBBCogWJ6LiFTgKFJSGE9FhEp7a2Frt27XLf3rt3rxIueXl5GDx4sEo7O3z4MP7973+rvz/44IMYNmwYJkyYgMbGRlWj88EHH6h6m+5ERXRcNsAiOqcljjqlEkIIifoaHVPowEqhQwghPSZ01qxZgzlz5rhv61qa66+/Hs8884zqkXPgwAH335ubm/Gzn/1MiR8xEpg0aRLef/99rzG6A8/UNYe9mUKHEEJI1LmugTU6hBASNkL+RhXHNGluFggRO5788pe/VFtPo+2lBYnoEEIIIdES0dFmBIzoEEJI+IibwIYhdAxdZ7c39/R0CCGEEEWLo9VeGlZGdAghJFzEjdCxepgRMKJDCCEkKiM67KNDCCFhI26EjkUiORQ6hBBCorBGx+ZOXWNEhxBCwkX8CB1xW9NCx8HUNUIIIVHousaIDiGEhI24ETqC3cKIDiGEkOjro0MzAkIICT9xJXQcphkBhQ4hhJDoiuhoe2kKHUIICRfxJXQsptBxUOgQQkhv4+GHH8bQoUORkpKCk046CatWrWr38ZWVlfjhD3+IoqIiJCcnY/To0Vi0aBG6G7vDhUS365qReUAIIaTrxFXVo8Os0XFR6BBCSK/ihRdeUA2sH3vsMSVyHnzwQZxzzjnYvn07CgoK2jxemlnPmzdP/e3ll1/GgAEDsH//fuTk5PRIRCeJqWuEEBJ24kroOKVGx8XUNUII6W088MADuPHGG3HDDTeo2yJ4Fi5ciKeffhq//vWv2zxe7j9+/Dg+/fRTJCYa4kKiQT3uusbUNUIICRtxJnQSlNBhRIcQQnoPEp1Zu3Ytbr31Vvd9VqsVc+fOxcqVK/0+580338SsWbNU6tobb7yBvn374uqrr8avfvUr2Gxt08eamprUpqmurlaXLS0tagsV/Ry5bGqxu80I7C4LXJ0Yz9+44SQS48bSXCM1bizNNVLjcq6xNW5LhOba2Xl0REI81uhQ6BBCSO+hrKwMDocDhYWFXvfL7W3btvl9zp49e/DBBx/gmmuuUXU5u3btwg9+8AP143n77be3efy9996LO++8s839ixcvRlpaWqfnvmTJEnx53IKhptD5fPValG1r6PR4nuNGgkiMG0tzjdS4sTTXSI3LucbWuEsiNNdgqa+vD+px8RfRUULHdLchhBASlzidTlWf8/jjj6sIzvTp03H48GH8+c9/9it0JFokNUCeEZ1BgwZh/vz5yMrKCvn1RVDJQkHqhCzby5Gw1xA6J51yKlyDTu70+/IcV6fkhYNIjBtLc43UuLE010iNy7nG1rgtEZprqOioekfEqdBhRIcQQnoL+fn5SqyUlJR43S+3+/Xr5/c54rQmP9KeaWrjxo3D0aNHVSpcUlKS1+PFlU02X2SMrvzYy3NdFisSTXvphMQUubPT44VrXt05bizNNVLjxtJcIzUu5xpb4yZGaK6hvH4wWOPOjECEjpNChxBCegsiSiQis3TpUq+IjdyWOhx/zJ49W6WryeM0O3bsUALIV+R0Sx8dbS9ti6vzj4QQElHiS+hYzR8QRnQIIaRXIWllTzzxBP71r39h69at+P73v4+6ujq3C9t1113nZVYgfxfXtZ/85CdK4IhD2z333KPMCbobu2oYagou2ksTQkjYiKtTRy6mrhFCSK/kyiuvRGlpKW677TaVfjZlyhS8++67boOCAwcOKCc2jdTXvPfee7j55psxadIk1UdHRI+4rnU3KqJjpq7RXpoQQsJHQlxGdJw0IyCEkN7GTTfdpDZ/LFu2rM19ktb22WefoacxIjq6YWhc/SwTQkhEia/UNTOiA7quEUIIiRIcDqe7jw4jOoQQEj7iSui4dO4zzQgIIYRECYzoEEJIZIgzoWPaiLJGhxBCSDRFdLTrGs0ICCEkbMSX0LEYPyAW1ugQQgiJEhyev0m0lyaEkLARX0KHZgSEEEKiDJfdI8uAER1CCAkbcSV03D8grNEhhBASJXi1PKAZASGEhI24jOgwdY0QQki04GREhxBCIkJcCR2d+0yhQwghJGowIzouWACPpqaEEEK6Rnx9o7ojOkxdI4QQEh24zN8kh+71RgghJCzEZ+qay7TxJIQQQnoYl9nE2t3UmhBCSFiIK6FjMXOfmbpGCCEkWnA5mtUlhQ4hhISXuBI62s3GytQ1Qggh0YJ58s2pWyAQQggJC/EldNypa4zoEEIIiRJM1zWXxdbTMyGEkF5FXAkdi47oUOgQQgiJFswsA6auEUJIeIlLe2mrk2YEhBBCoit1zcUeOoQQElbiS+iYPyKM6BBCCIkaWKNDCCERIa6EDlPXCCGERG3DUAodQggJK3EldKwUOoQQQqJV6LBGhxBCwkpc1ujYKHQIIYREC7q3GyM6hBASVuI0okMzAkIIIdGBbnlAMwJCCAkv8SV0EowfERsY0SGEEBIdWEx7adboEEJIeIlLMwIbIzqEEEKiBaauEUJIRIgroWPVfXTgBJzOnp4OIYQQAgv76BBCSESIK6FjSUhqvWGmChBCCCE9idsJ1DwZRwghJDzEldCxmalrXqkChBBCSA9icTB1jRBCIkFcCR2LaUbg2beAEEIIiYqIDlPXCCEkrMSV0GFEhxBCSLRhcZkn3jx/owghhHSZuBI6CQk2OFwW4wYjOoQQQqIAq9Ph5QxKCCEkPMSV0LFZrbDDzIGmGQEhhJAoahjKiA4hhISXuBI6CVYLWmAzbjB1jRBCSBRgNX+PLKzRIYSQsBJfQsdmgV0LHe1yQwghhESFvbT5+0QIISQsxJXQsXlFdJi6RgghpOexmUKHNTqEEBJe4i51zeGO6FDoEEII6XmkelSg0CGEkPASZ0JHfk5Yo0MIISR6sLoM1zWrLamnp0IIIb2KOBM6FrS4KHQIIYREX+oaPJtaE0II6TJxV6Pjtpdm6hohhJAowOaO6FDoEEJIOIlf1zWaERBCCOlhXC4XbO4aHfNEHCGEkLAQX0JHRXTMt0x7aUIIIT2Mw+lCIoyIjo01OoQQElbiN3WNER1CCCFRIHQSTKFjYY0OIYSElbgSOgk2q7uPjos1OoQQQnoYu1NS18yIDoUOIYSElfgSOhLRMV3XHHYKHUIIIT0vdHTqmoWpa4QQElbiMHXNEDpORnQIIYREgdBJMM0IrIzoEEJIWIkroZPoIXQcLc09PR1CCCFxjjIjsGh7abquEUJIOInbiA5rdAghhESTGQGsjOgQQkg4iTuho80ImLpGCCGkp7E7na1Chw1DCSEkrMSV0LFYLHCY9tJOmhEQQgiJoj46sDJ1jRBCwklcCR3BYTGFDiM6hBBCehi7o9VemhEdQggJL3EndJwWs0aHER1CCCE9DGt0CCEkcsSd0HGYQocRHUIIIdHRR8ewl2bqGiGEhJe4EzpOi3HGzOUwf1gIIYSQnozomPbSoL00IYSElTgUOtpemn10CCGERJMZAVPXCCGkR4XOxx9/jAsvvBD9+/dXLmavv/56h89ZtmwZpk2bhuTkZIwcORLPPPMMegqnaUbAPjqEEEJ6mhbaSxNCSPQInbq6OkyePBkPP/xwUI/fu3cvzj//fMyZMwcbNmzAT3/6U3z729/Ge++9h54UOmDqGiGEkCiI6Lhd11ijQwghYSXkb9XzzjtPbcHy2GOPYdiwYfjLX/6ibo8bNw7Lly/HX//6V5xzzjnoblyM6Cge+2g3UhKs+MbsYT09FUIIiXMzAkZ0CCEkEkT89NHKlSsxd+5cr/tE4EhkJxBNTU1q01RXV6vLlpYWtYWKfo5ctrquNXdqLH9jhpPuGLemsQX3vbMNVgtw6dQipCTaonau0T4u5xpb48bSXCM5bmfmQLrDXpoRHUIICScR/1Y9evQoCgsLve6T2yJeGhoakJqa2uY59957L+6888429y9evBhpaWmdnsuSJUvQ0GL8oJSVFGPVokWdHstzzEgQyXErlYZMgNMFvPL2e8hN7vqYkSCWxuVcY2vcWJprJMcNhvr6+h577XjAYXciUbuu0YyAEELCSlSePrr11ltxyy23uG+LKBo0aBDmz5+PrKysTp2RlIXCvHnz8N/tHwP1QH5eDsYuWNDpOXqOmZgYvh+n7hj3UFUzsG6Fun/KSadiQv+sqJ1rtI/LucbWuLE010iOGwo6ok4ig8MzjZr20oQQElYi/q3ar18/lJSUeN0nt0Ww+IvmCOLOJpsv8kPflR979VwzNcDidIRl4dDVOfXEuC2u1h/WmmZnl18nFvdBuMflXGNr3FiaayTHDfa1SeRw2T2EDiM6hBASW310Zs2ahaVLl3rdJ2co5f6ewKVzoJ3xm3feaKbvCcfr2E+IEEJ6CoenAyjNCAghpGeFTm1trbKJlk3bR8v1AwcOuNPOrrvuOvfjv/e972HPnj345S9/iW3btuGRRx7Biy++iJtvvhk9gXZdgzN+7aUbmp3u6xQ6hBDSc3g5gDKiQwghPSt01qxZg6lTp6pNkFoauX7bbbep28XFxW7RI4i19MKFC1UUR/rviM30k08+2SPW0oLL/CGxxLPQ8YjoVFDoEEJIj+E0hY4TFsAa8SQLQgiJK0L+Vj3zzDPhcrnabM8884z6u1wuW7aszXPWr1+vLKN3796Nb3zjG+gpXLrYM4776HgKneP1FDqEkN6BNLIeOnQoUlJScNJJJ2HVqlVBPe/555+HxWLBxRdfjJ6K6Dii0xuIEEJimvg7feQ2I4hfodPY7BnRid/9QAjpPbzwwgsqw+D222/HunXrVAaBZA4cO3as3eft27cPP//5z3HaaaehJ3DajZNNuscbIYSQ8BF3QkebETB1zYA1OoSQ3sADDzyAG2+8ETfccAPGjx+Pxx57TPVde/rppwM+x+Fw4JprrlF924YPH46eQEd0nLp+lBBCSNiIv29WXaPjotARKHQIIbFOc3Mz1q5dq8xwNFarFXPnzsXKlSsDPu+uu+5CQUEBvvWtb+GTTz5p9zUk9Vo23/5C0utItlDRz3G06IhOQqfGCTRuOMaK9LixNNdIjRtLc43UuJxrbI3bEqG5dnYeHRF/Qse074zriI5H6hprdAghsU5ZWZmKzhQWFnrdL7fF7dMfy5cvx1NPPeV2EO2Ie++9V0V+fFm8eLGKHHWW/Xt3q8sWpwUfLFqEcCEGQJEgEuPG0lwjNW4szTVS43KusTXukgjNNVjq6+uDelz8CR2mrnn10RHXNTGTkEJcQgiJB2pqanDttdfiiSeeQH5+flDPkWiR1AB5RnQGDRqE+fPnqwbYnTkbKQuFQQOLgArAkpCEBQsWhDxOoHHnzZsX1mavkRg3luYaqXFjaa6RGpdzja1xWyI011DRUfWOiFuhY2XqmsLudKGmyY6sFPZvIITEJiJWbDYbSkpKvO6X2/369WvzeHH/FBOCCy+80H2f02n0F0tISMD27dsxYsQIr+ckJyerzRf5oe/Kj73V5XTX6IRz0dDVeXXnuLE010iNG0tzjdS4nGtsjZsYobmG8vrBEHdmBBamrnmlrgnspUMIiWWSkpIwffp0LF261Eu4yO1Zs2a1efzYsWOxceNGd/Nr2S666CLMmTNHXZdITbdBMwJCCIkY8ffNagodRnRaKa9rxpA+6T02H0II6SqSVnb99ddjxowZOPHEE/Hggw+irq5OubAJ1113HQYMGKBqbaTPzsSJE72en5OToy597+82oWNmGxBCCAkf8ffNStc1NLYYqRIaRnQIIbHOlVdeidLSUtx22204evQopkyZgnfffddtUHDgwAHlxBZtuMzsAkZ0CCEk/MTdN6s1wYzoxHHqmqcZgUCLaUJIb+Cmm25Smz+WLVvW7nOfeeYZ9Ahm82rd440QQkj4iL7TWxHGYv6Y2OI4oqNT19KTjE7cFbSYJoSQHsHiMH6LXIzoEEJI2Ik/ocMaHbcZQf+cVHV5vK5nmz4RQki84jIjOqzRIYSQ8BOHQidJXVpd3ulb8Zi6NiBXC53Wbt+EEEK6D+0AytQ1QggJP9Z4rdGxwQG4XIjn1DVGdAghpIfRQsfCXmaEEBJurPFqL62IU0MCt9DJTlGXrNEhhJAeQtfoMKJDCCFhJ+6Ejs2W0KZ/QbzX6NBemhBCegbd6oBChxBCwk/cCR2rV0Qn/oSO0+lCk93pJXSkYSghhJDux6J/hyh0CCEk7MSd0LEkGmYECmf8GRI02lvf8wBT6FQ1tMDu8G4iSgghpPvMCHQza0IIIeEj7oROgi0BTpfFuOGIv0hGQ0uroOmXnQKLuSsqG+IvukUIIdES0WHqGiGEhJ+4Ezo2qwXlyDRu1BQjXq2lkxOsSLRZkZ1qnEVknQ4hhHQ/7p5unmnVhBBCwkLcCZ0EmwV7XP2NG2W7EK9GBKlJNnWZl2ak8h2n0CGEkG7HolOoGdEhhJCwE39Cx2rFHmeRcaNsB+KNRjN1LTXREDq56RQ6hBDS065rjOgQQkj4iUOhY8FuHdEp34l47aGjhU6eFjrspUMIId2O1W1GwIgOIYSEm7is0dnjKorb1DVdo5OS6J26xhodQgjpfiwuw4zAwogOIYSEnTit0TGFTvkuaSyDuExdS/JNXaPrGiGEdDc2pq4RQkjEiD+hY7XioKsALUgA7A1A9SHEd+qa6brG1DVCCOl2rKYZASM6hBASfuJQ6FjggA1HrDp9bWd8p66lJ6vLcqauEUJID5oRsEaHEELCTVzW6AgHLf3jUujoiE5KotU7okOhQwgh3Y7NZUZ0rEYaMSGEkPARd0InwWa85X2WgXHpvNbGXpp9dAghpMewwojoWBjRIYSQsBN/QseM6OxHfEd03A1DTTMC1ugQQkjPmRFYWaNDCCFhJ25T11otpjsndJbtKMXDW6w4VNGAWKzR8W0YWt/scP+NEEJI9wodmhEQQkj4iTuhk2imrrmFTs0RoKk25HGe+GQfdlRZ8f62Y4jNGh1D6GQmJyDRZog/pq8RQkgP1egkUOgQQki4iduIznFXBpCW39pPJwScThc2F1er6xUx1n+mwaePjsViYZ0OIYT0EFYYQsdKoUMIIWEnbmt07A4nkD+qU+lre8vrUNfkiMnalsZm79Q1gXU6hBDS06lrdF0jhJBwE39Cx0zTsjtdrUInROe1jYeq3Ncr62MtotNW6DCiQwghPUOC6bpmo+saIYSEnfgTOlbjLTtE6PTpXERn4+FWoRNrURB3w1Azdc0zokOhQwghPVOjw9Q1QggJP3FboyMRHVefkZ0TOjEd0fHuo+OVukahQwgh3UqCu0aHqWuEEBJu4k7oaIcxwZGnU9d2icNAUM+XSNDmI54RnZaYtpf2tJg+HmPRKUIIiWUksUCnrlHoEEJI+InbiI5gzx4MWBMBewNQfSio5+8tq0WdWdAvVDS0wOVyIfYahrZ+9HlpiTHpIEcIIbEudGwwTrIxdY0QQsJP3NboCHbYgLxhIaWv6fqccf0y1WWz3amabcYKTWbqmu6j4xXRYeoaIYR0q9BJdJsRUOgQQki4iT+h45m65vAwJAiyl86XZn3OzKG5SLC4Ys6QwLdhqNAnPVldUugQQkg3p65ZaEZACCGRIu6Ejs3ikbrm9OylsyOo528yIzonDMhCuvm7FEspX37tpc03whodQgjpPuRcW6JpRmCj0CGEkLATd0LHarW463SqG+0hNQ0VI4JNh6vV9Qn9s5Butj2IlYiO/Ki2yD/tuK7FUr0RIYTEMk4P1zUbzQgIISTsxJ3QEaYPzlWXb2w4HFLq2p7SWhURSUuyYXh+OtITYit1zSzPUaQmtW0YKpbbNU1GvjghhJDucF0zhI6FNTqEEBJ24lLoXHPyYHX5v1UH0JI7wriz+jDQVBtUfY5EcyQq1Jq6FhtCx9MzITmh9aOXeh0Rb7H0XgghJNZxeAgdUOgQQkjYiUuhc+7EfuiTnoSS6iYs3d8CpPUJKqqjHddOGJCjLnXq2vEY6aWjIzqStmbxqFXyTF8rp9AhhJBuj+ioVgeEEELCSlwKneQEG66YOUhdf/azA63pax3U6biFzsAsL6FTGSOpa83Otmlr/up0CCGERB6p+0w0XddgNX9QCCGEhI24FDrC1ScOhgQ1lu8qQ1XueOPO3R8EfLzd4cSWI9XeEZ1EV0zZMruFjocRgSY71TibWBkj0SlCCIl5XB75xDYKHUIICTdxK3QG5aVhzpgCdf31ppnGndveBloa/T5+d2mdMiJIN40IvCM6sSEOTGdppCS2/dizUgyhU0szAkII6R6cHkKHqWuEEBJ24lboCF83TQn+uj0Prsz+QFM1sHNxu2lrEwZkK4tqIdbspZudloCpaxnJxpuh0CGEkB4QOjQjIISQsBPXQueM0QUYkJOKykYHdhScY9y56WW/j914qFJdnjAg232fTl2r6AWpaxkphtCpkd5ChBBCIo7LM3WNER1CCAk7cS10xCL66pOMqM6j5dOMO3e8BzQatTj+IjqTBnoIHXdEJ0ZS15ytdtKBIzqx8V4IIaS3RHScsEg3656eDSGE9Dri/pv1ypmDkGiz4PWjeWjKHgHYG4Hti7we02x3YrNpRDDRI6KTYQodqd1p1AUwMRrRyTQjOrWM6BBCSLdgMSM6drT9TiaEENJ14l7o5GckY/6EfvKTg9WZZxl3bvROX1t/oAJNdqfqvTOsj2FEICTbgASzXicW6nR0w9D2IzoUOoQQ0h24XMbZJwfouEYIIZEg7oWOcPZYw33tP7Wm+9qeD4G6cvffV+w2rs8a0cdtRCCIPXVuWmLMWEx7NgwNVKNTzYgOIYR0CxYzdc1uYUSHEEIiAYUOgFNH5qvLxSUZsBdOApx2YMvr7r9/uqtMXc42H+dJjil0YsFiuqUd17VMbS9NoUMIId2CxWV83zKiQwghkYFCB0BBVgrG9suEywVs76vd115RF3VNdmw4aDiuzR7hT+gkxUxER9foMHWNEEKiAJ26ZqHQIYSQSECh4xPVeb35ROOO/Z8CVYexau9x2J0uDMxNxeA+aW2ep1PXKmOhRicYMwIKHUII6WbXNaauEUJIJKDQMTltdF91uXC/Da7Bs+RUG7D5VazQaWt+ojlCa41ODKSumWYEqUnWwBEdpq4RQkj3pq6xRocQQiIChY7JiUPzkGSz4khVI8qGXWTc+fnjWLPrsLp6ysg+fp+Xa6auxYTrWhBmBM0OJ5rs0W+VTQghMY9pL83UNUIIiQwUOiZSoD9zWK66/p7tTCB7MFB1AOeXPa3uOyVAREebEfSE0HG5XKp/T2lNE+wOU8V0skYnPan1h7aGUR1CCOk21zUnhQ4hhEQEfrt6cOrIvlixqxzL9tbh6xc8APz3MnzT9g6+yJ6LvpnJ7aauVXST69rB4/X43rNrcaSyQQkSqR8SRhdm4J2fnA6bh/11KK5r8jxJX5MaHUlfk/5ChBBCIt8wlEKHEEIiAyM6Hpw2yojarNxdjpbhZ2NDzlzYLC781vko4PAvZLTrWkU3ua69tv4wNh+pVsJKixxhR0ktjtU0BtUw1F/qmkDnNUII6UaYukYIIRGFQseD8UVZyEtPQl2zA+sPVOL25q+jwpWBooadwMr/6yCi07HQWb3vOH7+0hddsqIWFzjh5rmjsfLWs7DxjvkYkJOq7pMoT2drdDzrdJi61nkamh1YtLGYYpEQ0iFWU+i4aEZACCERgULHA6vV4m4K+vzqA/jieBLudXzd+OOy+4Dy3YGFThDi5f8+2IWX1x7C6+sNg4NQaXE4se5Ahbo+f0IhirJTVaPPAbmG0DlU0b7QadE1On5S1wRGdLrOM5/uww/+uw6Pf9T2WCGkPWoaW/DZnnI4PSK1pHfD1DVCCIksFDo+nGYKHUkRE3YWXQgMOwOwNwJv/hhorvPruiZRoI7cyvaXG8/dVVrbqblJylp9swNZKQkYU5jpvn+gO6LT2KWITmsvnei3yo5WvjxkNJc91EF0jRBf7nprC772+GdYuu1YT0+FdHNEx2ml0CGEkEhAoePDqWadjss8qTp7ZF/gwgeBhFRg/3Lg8TlAyWb34zOTE6Dr/yvbMSQQVzQdcdnTSaGz2kxbO3FYnoo+afqbQudwZX3XUtfMiA5T1zrPjpIadVndQLFIQkOfANlWXN3TUyHdBCM6hBASWSh0fBDRMKJvuvu26p+TNxy45iUgoxAo2w48cRasa/+p1JAIjmB66RRXNbrNA3aXekeFguVzU+jMHJrndb9OXWsvoiNW1LphqD97ac+IDoVO52i2O7Gv3BCb1Q3chyQ0ymqb1KX08uoK8n+dxFbDUEZ0CCEkioTOww8/jKFDhyIlJQUnnXQSVq1aFfCxzzzzDCwWi9cmz4tmThvVV10mJ1gxbbDRWwfDTgO+twIYOU+lsdne/QVm7vs/oKmmtZdOXeCz+AeOt0ZbpO9NdWNoZ/wlb3/N/taIjifuiE47NTotDhecsHQQ0THeB2t0Osfesjo4TDFbxYgOCZHy2uagTEXaY2txNabevQRPLd8bxpmRSGFxGWF2FyM6hBASHULnhRdewC233ILbb78d69atw+TJk3HOOefg2LHAeeVZWVkoLi52b/v370c0s+CEIlgswNxxhd7Rj4y+wNUvAvP/H1zWBPSvXI2EZ7+CISn1HUZ09ptn+jV7Qozq7DxWq1LjRKRMHJDt9bdgXNc864dSkqztuq5JHx0SOjuPGWlrQqhClsQ39c12VX8nFFd1Xuh8urtcfU8s3VoSxtmRiLuuMaJDCCHRIXQeeOAB3Hjjjbjhhhswfvx4PPbYY0hLS8PTTz8d8DkSxenXr597KywsRDQjEZP3bzkDf7psUts/Wq3AKT+C47qFaErIhOXol7i34ucYaDnWrtDxjOh0pk5n1d5ydTltSA4Sbd4fW/8cI0JW02QPGEloMC3XpLQnyef5nvVGAiM6nUN6GWkY0SGdieYEYyrSHhItFrpiYU+6DwodQgiJLCF9uzY3N2Pt2rW49dZb3fdZrVbMnTsXK1euDPi82tpaDBkyBE6nE9OmTcM999yDCRMmBHx8U1OT2jTV1UZxbktLi9pCRT8nlOcOzkmWn5+Az2kpmIRPR/0OZx3+OwqrD+GVpDuwpLgALS39/T5+X5mxCE60WVQa2c6j1X7HDjRXsZ0Vpg/OafO3RIthcy1NRA+U1WBsv1ZHNk1NvbE/JUJlt/sXMqkykKovaQ5qX3VmvwZDLI3rOeaOo61F5HJ2vr6xqY0o7cy48bhfIzVutM61uLI1wisnGo7X1Cvr+FDHPVbd4La7D9d7DPe+iiSSVv3nP/8ZR48eVdkGf//733HiiSf6fewTTzyBf//739i0aZO6PX36dPXbFOjxkTQjcFmNtGFCCCE9KHTKysrgcDjaRGTk9rZt2/w+Z8yYMSraM2nSJFRVVeH+++/HKaecgs2bN2PgwIF+n3PvvffizjvvbHP/4sWLVfSosyxZsgRhJaUISwb/AhO2/hkDHYdwyRffxhcV16E4ZwacVsOgQLNpn6TAWTA03YGd1VZ8umk3xrbsDGquUlu8fJvxfOfRHVi0aHubx6dbbKiABW++vxx78toWIx9R66gEWF12LFq0yO9r7iwToWPD/iMlAR/T0Vw7YkWJBauOWXHjWAcyErv584rguDLm+j3GZ6R57e13O3yPwYwbbmJpv0Zq3Gib68bjxv89zQtvLUH/9NDH3bpXhLUV5bWNWLhwkUrB7Sr19e27OUYLOq1asgykdvTBBx9UadXbt29HQUFBm8cvW7YMV111lfo9krrRP/7xj5g/f776bRowYEC3zNkKRnQIISSSRPzbddasWWrTyI/KuHHj8I9//AN333233+dIxEh+sDwjOoMGDVI/QlLv05kzkrJQmDdvHhITw3PmTI952oIr8FzmRExZ8X3MsO7AjP2PwVWcAdfYC+CccBlcQ0+Dy2LFb9d9KCbTuPSUsbjv3R2oT8jEggWzg5qrpL1VfbZcRYO+c+l8pPpp+Pl25QYc2noM/UdNwIKTBrf5+5q9ZcCX65CdnooFC073+54ydpbhXzvXISk9GwsWzIrIfn30/z7FvtpaJAyejAVTB3Tb5xWpcfWYZ5x1Nn72+ccqCiiLSxGnJ556Bob2Se+xuS7ceBSbjlTjF/NGKXfAWNqvkRo3Wudas+YQsH2L+/bIyTNx5ui+IY/7j30rgcoa2F0WnDl3PtLNdNSuoCPq0Y5nWrUggmfhwoXqRNuvf/3rNo//73//63X7ySefxCuvvIKlS5fiuuuu65Y520zXNUZ0CCEkMoT0K5ifnw+bzYaSEu9CV7kttTfBID/WU6dOxa5duwI+Jjk5WW3+ntuVxUlXnx9ozKy8Qny9+Vb8qfB9XIRPYKk6AMuXz8P65fNAel80DZuLU1r64ROcgLPH9VNCZ395A6y2BNg8+uEEmuu6g8ZCY9LAHGSl+3esG5hnRLqOVjf7fY92l5FCJWYGgfZBTnqyu/lpKPsplP1aYtYQHK5s6vA5kfi8IjXukaoWZR8uvYikoatYBIsJX1dfpytz/X+LtivL4oumDFDHTjjGbI9YGjfa5lpR751Oeqy2xWucYMct96jNqWl2IaerIUXztaOdzqZV+0auRFjm5Xm7WkYypVq7rjlhC3uqYbSlZ3bXmLE2bizNNVLjcq6xNW5LhOba2XmEVegkJSWpPGY543XxxRer+6TuRm7fdNNNQY0hqW8bN27EggUL0FsQe+lGJOOppGtw0ff/Dzj4ObDxRWDza0BdKZI3/Q+PJwFNSETSkjm4NHE0FrZMx6GKegwJ4oz/6n3+++f4c147HMB5rcFsouMvGtTGXjpCrmvi/CZ1RMJ+H3OG3tLscWRBBhpbHEro9GTT0IZmh7svS0l16+KMRCeeAqWzFtNiQe9paiDmKIPMEyC9nc6kVfvyq1/9Cv3791fiqLtSqrUZwfGqqpDShWMxPbO7x4y1cWNprpEal3ONrXGXRGiu4U6rDjmvQVLKrr/+esyYMUMVbUoedF1dnTtdQEL+kt8sPwrCXXfdhZNPPhkjR45EZWWlKhQVe+lvf/vb6C3kpRv1OJXiuiaubENmGdt5fwL2f4rdK15G4s53MNhaCuxajL/YFuMOaypqFp4PnPEtYNBJgDWwAFllNgo9yad/TihCRxbf7TUL9bSXFve2SHDMY8Hta7fta7VrN050xgxi/y2MLsxwv7eedF7zPA60ExeJXkpNUVqQmYxjNU0o7oTzWmWDEVXU0HkteO677z48//zzqm4nUJ+3SKRUL9v0rLqel1+IM8N08i9a0zO7a8xYGzeW5hqpcTnX2Bq3JUJzjVRadchC58orr0RpaSluu+025WwzZcoUvPvuu+4zaQcOHFApA5qKigqVNy2Pzc3NVRGhTz/9VFlT9xZy0pL8LyxsicDwM/DOvv64f/M5+MF4O345aAvKVvwL+fajyNzzMiBbYjpQNAkomgxLwQnIbKgGzJSGY9WN2Fder+o+pg81m5f6YUBu+7103BGdxMAuYJJ2JTTbnSr6kpwQWBR1hqPVjQHttjV1TXac9cBypMGGiy5AzLDrmOGaNaog0x216sleOp7HgY7skOilzBSjkwZm4/2txwKesGh3DJ/PuT27+95GV9KqxSBHhM7777+vTHO6M6VaR3QstqRen57Z3WPG2rixNNdIjcu5xta4iRGaayivHwydqlSVNLVAqWpyRsyTv/71r2rrzeiITk2jHS0OZxtLYWNRb0Fy/wnAnIvxr+ZLsGrZQvy83zrMrPsYaK4BDqxUm3wgZ0lx6l/uBQbOQGXiWJxhzUR1wUxkpQT+UPubER05GyxCJSnB6rePTrsRHY/C5bqm8AudEg+hI6KwprFFWej6dnaXNJ5yWFT6VbTVB7yzsRj9slMwdXCu34jOqMIMbC+p6fGIjqfQYUQndlLXThiQo4ROcVVjp8WS5rgUicUJnU2r/tOf/oQ//OEPeO+991SWQndjM13XQNc1QgiJCPx2DQPZqYlupy3pSt430/usn05lGtLHyOMeUZCFv7vG4c8ps/Hij/4DlO0EijcAxV/AeXid2hKaqoHdH2A0PsC/koCWqiTg2TOAUfOB0fOB3KFer9EnPQnJCVY02Z04WtWIweZr+aauiRlBIMQYIT3JpswIRIRoARcuZF6++2XigGyv+3aZgkE4VtsU0HyhJ9h0uArf/+86ZKYk4PPfnI20JOO/j8MJFXUTRhVmIiulTF2vbui5xqtMXete5ORCs7lm7Qw6GiMRHf1/RWpuOpP+plGptHFEqGnVYictmQnPPfcchg4dqrIOhIyMDLV1a8NQif4TQggJOxQ6YUAEgkRb5Ay+LC58hc5BM01LFwYP72sYEOyRAnapzSkYa2yTvwZHSwveWfgWzps+BIlH1+P9JQsxtulLDEQZsGuJsb3zC6DPKGDUPGDkXGDIbFgSU1Sdzp6yOhyqrG8jdCQ6IqS0k7qm63QMoRP+RbpnREdHutoTOrJAH+ldW9yjfLjtmLqUfbNo41FcNt3oA1XaCFUbISKxf3aKEr7RVKPD1LXI4nK58JVHVqK8yoYF5zkRahBSosBygkSY0D8LYsTY7HCirK4JuSnBR1V9BW281eiEmlb96KOPKre2yy67zGuc22+/HXfccUe39tGxUOgQQkhEoNAJExL9kIWt7+JCal2KzQW+jugM72ucLSyrbUZVfQuy07x/5FwWG9BvEmoLJuM7rxbB6XJhzXcGIr/4I2DHYiPNrXynsX32CJCYBgw6ET+z9MV71kLUHMwAhp3qZXDQGETqmk5fK0GT6s4ebnzdv/wZEmj3Ml/zgmjgox2l7usvrD7gFjpHGwyL8JGFmbBYLMhKTYiqGh3fM/3h5stDVfii3ILe46MYGrJ/d5VKjZZFpZyNTG1bx9Ee+jtDBE5+RjIKMlNUPZsYEuT2C74Pk3yfCEk2qxJK8VSj05m06n379qGncdfoMHWNEEIiAr9dw2gxLehCdM3B4w0qpU3O9kt6mRYThVnJauG/u6wW03zqPTQbDlRCslcG5qYhf/gUQLbZPwEaq4A9y4Cdi4Gd7wO1R9Xt8wGcLy+x7P+Aj2xAcgaQJFs6rq23oW/CUCQ1fRVwTUSglukZKZGzmNZmBMPy07G3rA4HjhsF/O2lrkULIkjXHahwL0hX76vA7tJaDM5JRrGp10YXGAJWR3SCtZeWFKWNh6vU2fwEn/quWEhd+8FzG1BSY8PV5fUY2c87QhcPHK5o3ddSIzcyuJZibT6fvPRk1di1KMcQOiJWx4ckdJrcEeNtR2viLqITi7hrdBjRIYSQiBCeVRVBnum85nsW1TNtTc72a0aYUZ096kywf9buNxbW04f4CKGUbGD8V4CvPAz8bBvwveXAhQ/hi6LLscY5Gk3WVEDOFIogqj4MlO3AwPqt+HbCO7huy43AgycA7/0WOLTWKCzyINM0JIhMRMcQOiea/YCUSUNLA7DpVaD+uEqv81ygR1NEZ/muMiU6RxVk4MwxBeq+F9ccVJclZkRHjAgEbRoRrNB5esVefOXhFeoyHDicLq96qPpmh3KziwQVdc3uJrBbioOzeuxtHPIROp01IsjPSPIyFpFeTJ0RTKMLM9VlRRyZEcQqNrfrGoUOIYREAgqdMFtM+wqd/eV1XmlrvkJHogKBWLPf6J8zw1foeCLiqd8JwPRvYOeMO3BZ8x34dtFrwC1bgZvWAN9ZBnxjIf5Z9Hu85piNZlsaUHUQWPl/wJNnAX+bCiy9Gzi21ct5rcNeOpUHYX3nFzh9+x2wbHpZwhId1jG4hY7ZD+hwWRXw/DXAyzcAz1yAvUdKvHRXZxaNXUH69wSy51623ajPOWN0X1w5c5C6/sraw6q+orheCx1jgalTEYOt0Xn7y2J1+dke4/PuKnJmv8XhUrVjYlCh74sEUhOm2d2OaO/NeInzThyz2i1N0tYEqfMSikO0mNafsfRyEo7HYeparEZ0KHQIISQyMHUtTOSlm6lrPukiB44bi5XBPh3KvQwJApyVl9Q1YVp7QseD/jnGAulwVROQ1d/rb5+mJGNJyzjUzRuGr/fdA2x+Fdj+DlCxF/jkfmPLH43vN/fHCQlZGLB3KlA0C8gdAmQUttb7VB0GPvkLsO7fsDlboGb2xveAVY8Cc+8ERszxOzdxINN1QiJ0rHDi53UPALs/Mx5wbDNyFv8EwPWq1qEn3MJ+9Nx6fLyzFC98d5ZXOqGINF2fI9Gck4bnqUWpLCzFCljMCASJ9nhFdIJI/xPzii8PGZ/zDtOWOlwRhn5ZKap/raRPyr7snxVeFz1BUhA7I3T+umSHEvkPfW2qEmSxzKGK+i5GdJoCRHQ6J3S04JbvIjl2PSPJJLpg6hohhEQWCp2wR3S8z+LrOpTBfdIDRHT8Lw6lL4tEVaS2Z4y5cOmIgTlp7jPMvgscbS+dlJIOjLvA2JrrDLGz6RVg5xKV4jYZOzBZjortbwLbzSdbEw3hJNvhtYDDEHPOIadiV2MuRlV8CEvxF8B/LgZGnGVsqXlAWh8gLQ/oMxJHqxPd9SsDc1Jwb9I/cYH1M7isibDM+Q3w4T3of2QxbrJl442sq3GwosGdEtUdyP4RkSORkL8t3YlnbjjR/Tepd5AFrFhzzxiaq/okXTptAP7x8R48uHQ3HC7Dlltc7/R71KlrHS00P91drlLitECRFLN0j35GnUFHpWQ+dqdTCR1jERzccRQKe8tqQxY6UpP06LLdqmD+W6cOa9OTKJZrdDojzrWJgI7oFGXr5r/Bp67JPtXj6NQ1cQKUFFTfXlUk+lLXrBQ6hBASESh0woTuOVPukyJkNAsFhgSI6Ehqm93hbFOEvs6M5sgiMNgCdWlkKWtq6aUjef964SQ0tPixl05KB064zNgaKoADn+PDlZ/h4K5NOCW3EiNtJUD1EcDZAlTuNzb1Zk4F5twKx4CTsHXRIgy76s9IXPkgsPop1ftHbZ5YbCgoOBFft43F7owzYPngLlxpXaoEwrZZf8GE0643RNFbP8bPE19Cft+puKNiaLdGdDYfqVYiR1i2vVT1zNHW13JbmDWij9u17vIZg5TQ0albI/qmuwWNdl2ThabUx7QnXD7Z2erkps0YJg/KCYvQkQif/twjtS89IzqyLyQS2VGERo5NETnCzpLamBc6Xa3R0alrfXTqmhmZDZRG6Y/Khha174WBuanq/7lEUKVOh0InFlLX+FNMCCGRgN+uYUKnLa3YXa4WKJJ+ImfztdDxTV3rn926GJHohTiRebI+xLQ1ISnBioJMw81NzjJ7Ch2dNpaaFMBeOjUXGHMudpaMwj3btuGrAwfggSunAE4HUFOsanJQdchIZRtkRjtazOhVej5w3h+Bk74LrP2XIY4ajgP15UBtKVB9CLklK/H/ElcCNf8ElhtP+43925iQcQYmyI3p1+PNd9/FRS2LcM2RP+Aly2+wvXGQirR0ZIkdDtabjmqaR5btwiPXTFfXP9ph1OecOaav++8jCzJU7dQa0zBCbmsk8pNosyjhJBbTgYSOHB8f7zCai+pjQdLXuip0dM2IHIO6TqjUPNsfbjzNNERgy3Hn28OpvX5K28OUrtdTyGfYZaETwIxAbKulEWlQY5gnWMT9USKOYo4iZgZSp9PR50GiQeiEP62UEEIIzQjChjijSe2JLEwk9UkvemTxKie4B+QaixeN2MgOyzfT1zwslTVrTaHTxnGtA9z5/T5ng/WZfVmEt0dGcqK3GYHU5mQPBIbMAiZd3ipy/HDEWoSv71+ATybdA3z9FcMI4ZbNwI/XY/mwn2Ctc5T7se8P+CFecMxx99KRov5f1V+Fz51jkWivw8Lk32JXynVI+mN/4P4xwD9OB5bcBuz9BHCE301q/UFjf39lilHb9M6mo9h1rEal/qzZV+E2IvDkCtOUQBhZ0CpUVS+dlI4NCfaV1ytRIqLowkn93SmLXcWdupab6m5eG4mIjqRL7TPNNlJsRjRhV2nHwkV6zWjCVZfUU0iqqv6/1WUzAvOzEht6OWkhxhwlNY0hjdHXPLmRa0aYfWsGSXSRAON7lmYEhBASGSh0woQsbn917hh1/aW1h5TJgI7miPiQs6y+SLqTsMejzkGoboaK8kgm1NTBoZ3d13Uink5QnjU6HTYMTUnodB+d51cfVDbMj3+8x/sPecPxbvbluLT5Tjw2YyHw3U9wZOJ31J+00JHLBocNP8MtcPY3IimC1d5o9AmSGqAVDwH/ugCuPw7F/kcuQe2Se4EtbwKl20MTP8f3qJogPHIK8N/LgZItbuMHcVSbP75QLTIfWbYbK3aVqRS0oX3SMMSnzur8E4pUbY5nDx1Na52OvcO0tRlD8jDF/Jy3H+36wl9HGOS401G9SAgd6fUiQj7BasHobFPoBCHUdD8lXf/UG4wI9HFQ02hXNumdMiNIT3Z/l7id14K0mNZNYfXnrVNp2UsnukkwIzrWBAodQgiJBExdCyPTh+Th7LEFWLrtGB5YssPdb8XXWlozXBsSHPMu4t5bY9Q4iAmBjgx0Vei0RnTa17Zd6aOz5Uh1wMXrUXGCEyGVPwgoGoLB1ce8zBr0Ajm37wA4bngP5/xxIUprG/HAV4bhrKEpQNlOwzBh1/uw1JdhyLEPANk00lk8s8gwP1AmCH0MQwTdNDU5E9aWRpy6419IXG9E3BTHNsO1+wNc33wO/m75KiYNzMEP54zE4i0lWLjhAGwVe1GIWswdVdTmPUlK2n1fnYiXP1qP2SP6eO/H1I4jOjpt7bTR+e4C8p1hiHDoiM7AnFR36lMk7KV1fc7gvFT0T6nFl8eDFDoebmIiwGQxrhfmsWpEID2UNh+uRIvTgmM1jW1EcXtRsXJtRpDZug/EkEAifsVVTQjmG6DUJyqUG8DunkShGYGFER1CCIkUFDph5mfzxyihI71RdBRlcJ7/Rc/4oix1+c6mYvzsnNEoyEzxEjqh1OdodIqcpxOUZ41ORxGdTDOiU9MYenrYVrNhpCy6xJRBF1d71mUUZhnvUS8EJeoldQ66n5CudclItmFnbSb2OQqAomFA0WTDNMHpxEPPvoiG7R/i1OwynJpTDpTuAFrqjP5AsgVA3rnIEZfFCos4w034KrB9ESzb3sZ3EhbiksTPkLFqPyZXHsAHmZ9iQPNeJBe3ADLlDQA2pQApOUC/icC4i4CxF+DcCYVw7m9rJuHpvOYPSdVbudsQOqeP6otBuYYYlroK2fcpnh9TUy2w6h9G7dOc3xpiLgDyXG1rXZST6k5BjERERxsxDO2TjkKnIdCCEzrec5H0tZOHewvFWEFHz+QEw8FjlShvMtLXghU6UsMlEUPBU+wV5bT20hkcxDjacU2nrjGiE1s1OraE2BT6hBAS7VDohJnx/bNw0eT+ePOLI6rHij8jAs3ccQU4YUA2Nh6uwp1vbcHDV0/zEjrtNgoNgJgc+PbgECHREGrqWogRHekH4xlFkhSsU0a2FTrS20UvDKV2SQSYLAz1AlkLnSzzBGebGgWrFcvrB2O14yJ8mJiJ975zurxBoPowUHPUMECoN40QxBBBREJzLdBUA2dLA7bU52PMZb9FYp5ZXzP1Grz4v6dw0tb7MMR6DFh6l7p7uPwj83MlqvSSBIsT0Gl0u2R7H3j7ZtiGnILRTYWwLt8m5+cNhzqXC+c3OmCxpsBVlg7YCwCfhYyYTdQ1O9SCdHy/DFibqlCYkYiS2hZVp3NCUQYsTjusa54Clt8P1JnubOJod9XzqM0agbe+OKJqitKSWv8ba0tiEVrS/FUvfCW1SY6DsFBdrMwr9ppGBMPy09Cnxhhb5t6RpfbRauM4kc9f1vixLHQOe0TPspNgCJ3q4EWljrRlpSQgOcHWJjJbXN2IwbZQIjpJPhGd8NezkQikrtF1jRBCIgK/XSPALfNGY9HGYveZ2kCpaxIFuPerJ+ArD6/Awi+L8dWpJThpSDYOmplsoRoReEZ0PHtwiBuWXuN2lLomi2NdaxAKW8xojkbS104Zma+ui322XtAVZhsLbym2lhoSOSMu9Tla6Oj+QtlJxoRL/Swa95YZdRGSIqSQRbUYJsjWDo6WFuxetAhjMvt53f9y1Xj8vvlPeHnyWpzg2gX0HQNX0WTc9KETiw4n49SRffGfr483LLjryoA9HwJb31R1Q9Z9n2CcDFLs/VpXyiZrzZUAPrMaaXVqjoPUpWN/Df6euBlTE0phvfcIYG/AR5YUbEvqj+zFJ8A6bAzO2voMbF8YYhm5wwwHPKkveuJsvDP0Dtz6ZZFKH/vNAjWDNj10PGs2JIWtM+mICjl4jm0FtrwObHkDKN0GpOVjePKVSMRJKqKTajeEixw3pdUNKEioN9IH/QgeXXci7nIi+LpUlyT7RDez7cEaHbGEzlLHrMXLVa4jSmt02lrrSYE2vXSC0IBlbWp0/DcwJlEqdBKZukYIIZGAQicCDM1PV45cz31+oN2IjiC9Wr596jDVk+X3r2/C//vKeNVfRpyX2nteR65rkrJS32xXZ/t1Cl1QqWum65qII1kciyAJpT5H47l4lWiCaD7pr9LHLLjWAlCEjjh3+aauZSX5j+hIapZe1MnZ6ia7w+tMeKhICtmXhyvRhCSknv0roMColZHl+fdyqlD85iZ8f85IICXL2MRee+B04PSfA8f3wrHpNRzesBQDBw2BNTHZaK4KF3bs3AZH+V6MSChFkrPRiDjJdvBzNf4s+Uem7aHjUlyNmGLdAxySDZA94UovgOWMXwLTvwE0VgEvXgfsX4FLd/wc+2yX4/DmacDIA8bfGquQtfsovmM7jNFIBz7+HKn2RtyX/AXSndVIfv4RnFp5DNbMzcDUq4Hcod47QwwdDq8Djm0BakvM7ZghbMp3eT+2vgxfr38Ypye9iIaaX2G3Mx3XZu7BxPrPkfPoj4HGMtUoFuMvBiZcAhROUKJHoj1HTaEjLnadFjoSVXr3V8CO94DTfg6c9jPUtjjxyIe71LgndVOESKeuSe+a7MTQndd8jQg0upeO2lchCB3tsqcbGIu9NImFiA5T1wghJBJQ6ESIH581Cq+vPwyrxaKET3v8dO5oLNpUrDrY/+rVTeq+aYNz2k3/CYSkLImhgNRmyNlgEQ46bc1qcfl1f/MkPblVNNQ12ZEUZO64juiIgYL0RtnmUVQvfX0E6fHj2UxSapdWoByf7zmuGmuKe5eKfjkdrULHJ6Kzz4zmeKbsDDTrWzqDLLIlfU5Sh4abdt+aEwZm49UfzA785LxhcM76EdZXjEDRggVeZ2U/+Gg37ntnGy6dMAB/WVBk9CCqOqAum8r24dXVu7HHWYTvX3ou8gZPALIH4O1PPsfb73+IefnHccngemwrt2DU1/+MxPTc1n5F174O5zu/hHXtP/GLxBeBuheB51qnJH5102Ua4ohtejV8TXa5fKyHIfIH+PiPxjb4FGDSFYC9CdizDNi3HGgOIDpkITbibGDCxcDIebBveg3HF92NwdZSYOXPIX6DC/Q3itamIo4+ud/YRPTkDYfD4cCjrlJYEl2YsicHkxJrgJIEuF4cAEtCKpDVH8iRqNdgIKNIpe954XQCa/8JvH8H0GSK6w//HxyH1+FH1d/Ch/ua8NaXR/DxL+Z06v+PX2pKjJRBSYVsqAQaK4HmOmDY6SiuyHZH0IyIjqSuNXbCWjrJ7wkLSV0LBp265lujw4hObNhL2+i6RgghEYFCJ0L0y07BmzedqrqV63SwQEgTz3suOQHXPrXK3dhRhE5nkUWSiA1Jq1FCx7S7TQoiOCPpdNJrR8SRpDrpfhzBRnS+Om0A7n1nG3YcrVGOUtIvSJ/B10YEGp3St2y7kZ4lglCEWIvTgexE/4vGvWbfFs2xLgod3Sh0yuBcNddw4e6jIymAmYXGJpEg6SH0ZTFu/XSdajL722lnuJ9TNGIy3l1ch/WNybjoK2dg56JFGCWOcZ4kJGHb9Lvw7GdWfMf2NmQv5eTmIzcvX0Wc1hxuwP6KRkwckIsxRTlAQgpe3lKHzZU2XHDieFjLd2GybTesez8CDnxqbL6NYwfONFLtJMUvowDIGgAMOQVIMRb1wv7hX8MFTbn4TtJi/DR1ESxN1ShNGYrXaicgcew5uOGrFwK7lhrpbuKWJ6KnfJf6wjlDa+kjwFn6+pY1bfah7MELLDZYih8Aik4wokJb3wYOfmY8YMB0ZQjhWnYvbDsW4XfO9ThouRm7jg/Epv0lOCHhEHBkvfHY4XOAPiNC+xDLdgGf/g344n+Aw49g2PBfvOQagL9YL0f/rLPc4txSsQf47DOgfKcxx2FnKCHrpqUBOPAZsPdjTNhzDOda8zEkaU7r3+uPY9Chd/H3xH9hpnM7sLM/LF9UARMvNqKKnjgdcNZXoLGuCjYkulPX6LoWG9BemhBCIguFTgTRaVjBcNqovvjq1AF4df3hLgud0f2MqIo0Lj1lRL47ohOM0NHOa/IccYQKBklz0zU2C04oUtba8nxxVBPx0uq45p2eM8RMzSs3zzqPNOtzBL1oFAcxSb3TKXe6AF4Tytlzf0jqlDB1UOf3tz/crmt+9qHunyOfuSdiUayjWIHc2oQvDlXiOcfZahMuHTAQf7lisrr+x8c+xepjFfi/U6ZijNmE9MPKdVhYXowBuWPQFwMwccEfYa0/Bmx8Cdj6lrLexvAzja3fJGX40BHyOTQgBe/nfx03feuPWPrOG6gcdAbueW0zZtX3wQ3iDCcNZmVrqgF2f6giMNtL6lSaZmF2muo7df87m3C8ph43nDwAo3KtQNVhwzmv8iBclfthFSOJY5uMTSPi7+zbgJnfhhNWPLSnCFfu+Q1GWIvxZvLt2OsswNh/HQLEuteTnCGwDp+D/hVpsGw3u4i5xEDCYdQhiWyUS7lv+0JDVCkpKSp0ihGVSs0xBJ/TAfuaf2J002H8I+lBOP+7DF+t64tvJW3E8KNHgXfN11z9pHGZPxoYPAuo2Asc+BxwGBGYmbLJsb75QeCwRLH6AYfXItXlwIVaBNZWAG//CHj3F8Doc415iIgSIVa+C1ZHE740/7+4HkoAEtMxMmcY7k7Ix6bG4XAW94O1YJyEDTr8XEnPCB1bgvd3IyGEkPDAX74o4ncXjMenu8vQ1NiICf19ztyGwC/mj1FRknUHKlX61PmTjB4wHfgQeDmvSaQk2KahInLEeEEW91KrIAv2TYerlSGBp9DRjmuawT4mDZ7CMNUm9URWw5Wtusn9WKnn8aQzneg9WX/QFDpdEJb+yEo1/mv5Eyyf7z2uLk8d1adNFKgoO0UV64t7WSC+PGTMWTv2SVNT7XSmbcV16pOQn2GsgqVfi1taSYTh1J8aWxd66AyTtMykdDQl5rgb4O4y663ciJAaf5G6+sWag3jV+SXO6NsXmHwi9m5ah4UbizE0eyxGneodcbE3N+PDN/6Ds8b3RULpVqBkoxFxOuNXytBB3vNdb23BM1uz8D/rPXh3wD+RV/o5Jlj3G5olLR+W/lMNUbF/JVC5H7Z1zyhxgX2PBPdGR59n7KPBJ7f508f512DjK/fgOwnvILV4g0obFPHUIrGVYbOBggnAoVVGVKlsh7FpJEo27Aws21ODgqovMdZ6ENbKA4BsQsEE/K9qPN6qGYXvFu7A6bYvYZHnS4SsHVSqX1MVkko24Fr97f6Px1VkDz9a5x1ZIj2Ky+lEorg5qogOf4oJISQS8Ns1ipC8+nd+PBtLFi9GcpAmAP4QUfDAFVNw47/X4OkVe1XBfkgRnRCbhm41i8mlL5AstscUZimhI/Uv507sh6Om0Clok7qWHlDoSHmF1BscrGhQhgRa6OgFttT7iMgJxeHKF6lf0ONNiVREx0foiAPdweNGndHYfm3F7KjCTFPo1CGQ1P3iYJW6/Napw/DLV75U+3d3aR2G9klz72uxO9boAnVJixybHN4eOsM96s+0Y57Ui0ijVL0PPNFpjFr0jumXqYSOvyazchA0JOXDJWJjgiGUPPnv5wfwzKf71PVbLz8NeZMuR9Pmt/DzlzZiTctQ/ONbF2LSILO+SWzG9y2HY8diVG1dhpxcSVVMMBzbLFZjM19TWVGI6cRJ3wMkEhKAfXWJ+Kv9chwZdS3u6b8ce7ZuwP1HJ2OFcwLWXP3VVuMPqeuR+icRPeK6J5EzicpYLHjokRVYX1qJJ64cg3nZh4xeSUNmq9df/M9V+LSqFINTx+GUbzyKxPKtwKZXDeOJ/FFAn1FA/kh8WpaKbz69EuPzE/HqjdOMCNqxzXj6pdcwzrkbJ6UehFXen9Q/kajB6Wj9fk1gHx1CugWpE21p6bztvjw3ISEBjY2NaqxwEUvjtkRorr4kJibCZuu6qyqFTpQh9TwefgCdZt74Qnz3jOH4x0d71IJQSApy3FB76WwtNoWOGYUa289wLtteYtTtBIroyHsVdzl36ppPqp+kuonQ8exLooWJuGpJH5lQepb4sv6gUZ8zvG+626Uq7DU6PkJHRIxEv5Js1jY1S8Loggx8vKNURXSm+ykZkjQ+SUsUZg7Lw8yhuVixq1xFdVKTCpW7XaLN4q7V8BY6TUCYhM7eMiNqM8yM4uiUR/mMRWxJlM+fPboWYlLDpt5voXGsSC+dUHl13SG3nfslUw1r8eRJl8C5aQiKvyzGwk1HW4VOcgYw5lw4h5+NT5yLsMDHPKIrjmvZffvDeeZvsLluET48loRmp1OJvUHaNVHS3cZdYGwB3NLy8vKAISO9/iYNX4WKZoshwKRprmw+lB44jEYkIzmrT2vEpmAsnl6Yq+b46rdPxrScRr9W36TnsNtb66doL01IZFGOn0ePorKyssvj9OvXDwcPHgyf4U2MjeuK0Fz9kZOTo16rK69DodOLkRQ2qUFZZaZKJVqDaxjpr5eOHNj/b+FWlU72i3PGBozo6LP0gj5Lr53T9OLWE4nUiNCRY1hHBDTaQUoLJYnAaOFw4tBcJXRKupC61lqfE3q/oo7Q0QxpCipRHDF5EKRuSRiYl+rlQKfRC38lFArbjrv5SLUyuJB0tP7ZKZg9Ml8JneW7yjDO3P/Sg8XTWEGLHkldC8aqOLTUNe/PTMSqijAFEjo6omMeC/pY2VlSq96Xv33iDzHY+PKQEdm6eIp3Otb5JxSpvlTSy+rX546N2Bfx4UrzszR7V8nLSKRRxIUcs26h0w7qMwG8bNc18vkK+2uM/4t5ARbDbsc1n148Ykggc6motwNDmLIWbTg8hA4jOoREFi1yCgoKkJaW1unfBafTidraWmRkZMAaRD1rbxzXGaG5eiJrzvr6ehw7ZphVFRUZJRidgUKnFyOL6/+7aioW/G25OnMcdI2O2UvHM6IjqVFPLd+rrs8dV4ipg41FrNRut4noFBmL131ldSoCUeJ2XWu7mBNDAhEcYs8r7nOeFJiP1710tOOa1LEMNtPeumJG4BY6Ya7P0dENjRgqaLtfLXQC9UjShgSqRqcwcH3O5IGG/fjsEdKUdTs+212Ocyb082oW6jeiEwbEdlyL12F+0g9FdO085j9CU+wjdGQ/6Fos2Teq5idItzyJjMmxMCjP+/3OGVOgnAPFrl1qmCYNDP/n6xnR8dzfWugEUzsmfa7EVt1fw1BBC/9tVVac9uePcMm0Abhu1lC3GNboz9Uziidox0TpqUWiD0dL6+diS6TQISRSSHqVFjl9+vTp8iK/ubkZKSkpYRcksTKuM0Jz9SU11fhtFbEjn11n09giN0MSFUhdzCPXTMOg3FRMznOFtEiX5pyazUeMs+eCrosQjjcZgkhSsfTCTCIxsrCXNKoNBytVTx/BX6qWFiz+HOpk0SiUmotq7bg2tE9669+CWFCKzbVYbX+25zi+KLcoZ7tnVuxVc4uU0BGRqSNjnnU6+8vrvRzn/NXo6HqaOj9pxDqKoRfv0nBWegDJPn5309E2RgSeQkeiB/KZdBVtCCFph9lp3lGGEebnqF34fNHROREogkRwRplNWkNpHPqZGaU8cVhemzNzIpjPGlegrkv9T6Q4XKmbhbZ+lvq4DKZ2rKzGWOiK0Ev3k1cqwvXOC8ehMNWlIoPPfnYA8//6MW55YYM62+U7jm8vnjzzs6HFdHTisBv/waVBdCId8QiJGHa7sQaRSA6JLfRn1pW6KgqdOEAWgx/cchpmFYYmdDxd1zYdbhU6khakF3KH6izuSESSaaBgGBIYi1epNxFkIZdp1q34phlNHJCFq04c3OZv7kWjGdHRC2xxctOiSdLemu2Gc5Enn+4qU2YM8x74CGNvexen/vFDXPvPNXh6hw2/enUz7nhrixJoIkb0XMONCBDfOh1tRBAorUnmoyMExcY62osvTHE2aVC2WyiIhbjwodmPaECOt6DUaVESAWkIruwqeMc1H6Q3kF/nNbO+SEcXPOu1dIQiFKGzam+5+9j2hxxX+lj1FAXhQo6dynrjcx1gpq55ispgIjpldU3uz8dfGoWkH1594iDcOtmBf98wHedO6AfJ7BOhvmZ/Res4ZkRHp3q2jeh0/geCRF7o2GELaw8vQog3+jcg0vUkJPyE4zOj0CGBa3Q8UtfERU1IsFrUglkbHByut3jV52h07cXHZs8Yf9Ec/bi3f3SaO+3Kn9DRhgN7PZy+ctMSVdG950LPk7ve3oIlW0pUCpgIIXnssD5pGJbpwumj+ijL7StnDMLfr5rqrp8JN1l+eul0lLomjDbT146a+1Yjgkm7nUnqmmb2KEPoSI2L78JbEAGaY57drw7DmldH1vwJHR2Zk/QtETae6M9RIhiejmxj+mWEZEggLoI67fCkYf7TEHT6msxD0tdCQSKAHYkjbeMt+9WzIXBhSBGdpoBpa57I9/ys4X3w2LXTcek0w3ThxdUH3X8vDTBOnm4aytS1qBc6hBBCIgOFDgnsumZGdGTRt8lMXRMnN+G5z/erRqGHzbY2uj5Ho53XtEAKJHTao6/PolELHYnoiMovyEzxu6iUBf8eczH+t6um4uNfzMHWu87F4p+eip9OdOCp66bj4aun4Y+XTcKcsUaKUySFjmdEZ78ZlfK11vZERzh8hY6Oqknxu675EU4daQgdjW/qmufZ/pqWrp8d8fwcfJF0Nln8i07Y7RPVKa5qcEdzPM/SuCM6QQodSd+TY08MGXTvHl86m74mx84lj6zAnPuXtRFqnkgqpKcRgaavmT4WTEqldhvsa/Y5CoYrZg5yvyeplQomosPUtejE5RY6TFsjhESeoUOH4sEHH0S8QaFD2qDPUGszAinqFtcnqcO5ac4otVAtq23Goo1Hcbiu/YiOxp/jWkfos+NSzC8uW2Ju4BlJCJQmJIvQZodTRTIkhUmc3SIVtQmul46xH6vqW9R7EXwL6P3V6fimrn2hjQh8ev5I/xzPgnhfMwLPQvXq5sj00NGIgBnZ13+djq+1tO+xIgJK93xqj1Xt1Od0NX1t9b7j+OJQFfaV16vrHdXn+O7rQOK7vYiOP8e1QMwYkquOfzExELEj0Se3YPKN6FDoRDVOByM6hJD2OfPMM/HTn3ausbcvq1evxne+8x3EGxQ6JHCNjil0dDRH3NTkTPm1s4ao2499vMfo8QFgnE9Ex9cZSjuohToPSXMSthRXqYJsSWXXaV+tqW2Nfhfi4ggWrF1xJPDtpaPT1kR0pCUFPos7wdyXe6otWG/W5Ahfmo1CJw806nM0yn1tZJ/2IzrmvqrpYuqaCIY9pW176PgTaluOGNG8QM1CNXJb6pk8I3Ht8bkWOkP91+d4pq9JbZikrz3vkerVHm9/ecR9/dPdRh1Qe45rnkYEQoEZ0QmqRke7pfmYCLSHfNaXTTfS115ecwiVDS3ulEXPKJ+2lxbouhbd9tIOC4UOIaTzv8nabKEj+vbtG5eGDBQ6JLC9tBl90ClTegEuxgHJCVbsKTML63NT3Yt6TXpyAob0af0P5bu4DQbP9DRxTNP1J9r0QKfD+S4q9WJZGoH2JNk+NTr7j+u0tfa/aCTt7/wT+sEJC255aaP7+dpa2p9dsvTT0aljKYm2gBGdrqauVXhEpcT9zh/SxFT4bE95gIiOtxBT5hX9gjMkkJ5Ea81Iy4kB6nM0IspvnjdaXf/Dwq04YkZh2hv7nY2Gc11HQkfX6ASK6IhRgWfqm4jD2fd9gN+/vsltnlFmCpBQIjqC1OmIfl+177g76mTUrHl/neema9c1mhFEIy5T6DB1jZDuRfVoUfb+ndskw6Szzw3FHOcb3/gGPvroIzz00EPqd1K2Z555Rl2+8847mD59OpKTk7F8+XLs3r0bX/nKV1BYWKj628ycORPvv/9+u6lrMs6TTz6JSy65RAmgUaNG4c033+wwKjR//nyMGDECubm5OOOMM7Bu3Tqvx4iV93e/+101F7GgnjhxIt5++23331esWKEiVfKaMsY555yDiopWg51ww29YEjCioxe0m8wz8xP6Z7vPHEuTxhfWGGfJx5l9c3wRNzNtp9wZoaN770gkRJ/F92xQ6WtWoHFHHILsyRIpslK9XdeCMSLQXz53XzQOK3cUq8iBLI5/e/44HKlqVIXpYinty7zxhaq/0cnD/Uc5dETH04xAFvb/+HiPMjY41TQ06AhddyPNLP0JKmHWCEOAiAmAiDQtglsjOm0X9hIBXL2vwt1kNhDSMFUiexIB0nVg7XHD7GGqcei6A5W49dWNeOLrUwI+VsS0pIFJFEheY+OhSq/5B1Ojk52aoIS4iBmp09Hues99fkClu/3ns/2qFumxr08P2ozAF0n9O310XyzbXopHl+02xvCpz/E0I6isbw6pGSvpHhwO4/vVwdQ1QrqVhhYHxt/2Xo+89pa7zmk3o8MTETg7duxQQuGuu+5S923evFld/vrXv8b999+P4cOHK7Fw8OBBLFiwAH/4wx+U+Pn3v/+NCy+8EFu3bkVOTuAWGnfeeSf+9Kc/4c9//jP+/ve/45prrsH+/fuRl5fnFkciuO644w51u6amBtdddx3uuecepKen469//at63Z07dyIzM1P12DnvvPPU45599lkliLZs2eLugbNhwwacffbZ+OY3v6neX0JCAj788EPV6yhSUOiQdmp0WtTZh81mRMdzgX39KUNbhU6ABacsRBdvKXH38+kM+gy5PosvzmkaHdHR9tMatzubWSvSU7TW6LR4WUt3JHQEseK+bpQDf9+SiDc2HHGnJ0n9i6fLl0a+OJ+8fkbA8dypax5ZTJLO9ef3tquoxIpfnxXUe9po9vHxNZ/wpCg7VYlM+RxW7TmOueMLfZqFtk2t0xGdjpzXPOtzgrHklcX9ny6bjAV/+wQf7SjFq+uPILWDtLWLpvRXokfmv3rvcZw9rjBwjY6P0DGikLppaKMSOvJ/6B2zx5HMR97DxQ+vUD+2gpgqhMoVMwYpoaN7QfnW5wg5ptCRQ0eOQW1OQKIDl1mjw9Q1Qog/srOzkZSUpCIf/foZzrTbtm1TlyJ85s2b536sCJPJkye7b99999147bXX8NZbb+Haa68N+BoiYq666ip1XcTL3/72N6xatQrnnnuuuk+ESn5+64nQs846S4mZ6upqZGVl4fHHH1dCSiJPF1xwgYoiyfNFYI0ebWRUiBjTiKiaMWMGHnnkEfd9EyZMQCSh0CEBIzrSrV4WbHKWWxZonmfQZaErNs0f7ywPGEUY0y+rS2YEnrU9cobd1+mrb1agiE50pK751ujo6FYwQkcYlgn8aM4IPLh0F97+stivEUGw6MW0Tl2TiIOOBsiiXc7664Vxe7gNEfykz3ly8vA+Siis3FPuFjq6QN/fsaB7GXWUuvZ5B/1z/CGW1zfPHY0/vrsN97yzHT/3853a4nDi3c2GGLlgUn8lWGT+kr7mK3QkbUHMOPzV6AhuoWMel+I8KPtY7K5f+O7J+OFz69zRvUDRmI44e1yBcrfTvXz8jSGRpcxko5ns8fpmCp0ow0nXNUJ6BPkulshKZ5BFfk11DTKzMmG1Wjv12uFAxIIntbW1KuqycOFCFBcXq7qdhoYGHDhgtAIJxKRJk9zXJUIj4uXYMaMnn7B06VKvx5eUlOC3v/2tisKUlZWpSEx9fb37dSRiM3DgQLfI8UX+fvnll6M7YY0OaYPU12h0ypg0gvRNVfrblZPxy0l25QTlDzEvEOTEu04z62xER+OZjuZOXfOI6Ijlrq4F8ecK1jM1Onbv1LUOanQ8+d7pw3CSx6Le14ggWHxT115dd8gdlRA6ShnzbVjakeDS6WsrzToXiUjpWqoif0LHFNEypxqPvkOeiMOYjugE6p8TiBtPG6b2nXwWL+6xtsmTXrGrTIkGEYSyv08x5++vTudwpfE5iojw7Aek8a0de2eTIVLnjO2r6qve+OGpXkYKvrbQwZCcYFPpox2JJS1uRMj+//bOAz6KavvjJ5CEDoGE0Am9SQglgIDSQUD9UwSRIkVEUQKidAtFnqIUBdEnD3iIPKr09548OihSRZAivbfQlBJKQsr8P+dmZ9ndzGyZ3cnObH7fz2chuztz9uzsvXv23FMuMKajg4gOAJkLL2RxFoTWG9d/aj3XV5uWslNiy7Bhw0QEh6My27dvFw5FdHQ0PX7s/Ls/JMTehrF+7Myp0bt3bzp48CBNnDhR1Abx64SHh1tfJ1cu9Y6y7jyvB3B0QAa4qFnudiYXlMv1OY4OUQknvgQ7Gm82Lkcj21TJUCjtSY2OmqMj/6DkiBOvyNumrXEdkTsRCj2xbhj6KFlEUORi+Cg3IzoMR9KmvVLT+oO6rgeRDCVH534yUVJyKn2z7bS4Lzd2OBZv3yFNCf6xzG2XmRouHC7e4JI5Gn9PbFjJHcbkOhGlH+X8Wcmf9cnr9m2pZbi2hR2V3KHZrY0x3IXbi3MKG28ce+R2Nlqwx74Lmxwxa1u9mDiWI1LydXHsWiZH5hzT1hwdcI5g2aattalezDo2F7xenwY1r0BDW1XSHGnpEpvefU0tdY2RZf/1AA0JDJu6hogOAEAFTl1zp36FC/w5DY0bC7CDw6lu58+f97k+/DpxcXGiIQGnnHE9EEd2bCNEly9fFrVFSvDzjlEivYGjA5x2XpMdneolPPthKa8MjG5Xld5sUl6zHrYbjQZnC7LrcsXF1vwYL87LrXqtraX9HM1xrNFhJ4drJbhbndqPUmc1L2sGNqJ/9atHVWzSAT2BrxUvJEkURPN2XRR7I3H0orelVfjx+AS3NuqU9+1x5UTye+QooJxuJtfnsBOgVhQvtyRXq9PZYxmLdaIKatoXiaNG77asIP6esPa42F+H4b171lvT1tKdEXbG5FRNx+5x3FiAqakS1Yq0ieiwc8bONzuUzW02p+X7Q1tXpkEtKpJWePFBdvjUnK5CuS2d19Bi2rCOTloQHB0AgDLcDGDPnj3CaWGHQi3awh3TVq5cKSIsHHHp3r2708iMu3DjgK+//trudbjJwIkTJ4Re3LzANkrDXdgaN25ML730Em3cuJHOnTsnOsStW7dOPD969GjRue3tt9+mQ4cOiZqjb7/91s5Z8jVwdIAi3NXKdr8QpU5fmYFtypvjxp9cjG7dNNRSDyF3XPN32ppj17ULNo0ItISuuTbp2YqFNevC103uwvX3n86K/99oXI5qlU5POzx27Z7P0taU0tesHdec1GrJjoVanQ63U2bkaIsWXm9UhhoVSRPO8ZClB0TK2vaTt8SGuBxRqmuTUibrv/PMLbtmDJuP3xDpmGoOvG1ER25X3bhihGITCW+Z0a0WjWpbhdpWTy9UdcS6lw5S1wyHlCY7OkhdAwAowylp3LGsWrVqYh8ctZqbL774QnRfa9iwoei2xi2ba9eu7fXrc9tqWyfkn//8p2gfze2hOY1t8ODBFBn5ZBGPWbFihWhvzU0OWO8RI0ZYo1Jcu7NhwwbhjNWrV48aNGhAa9asEd3X9AJLSUCRvBZHh+Hf5VWLaYskeItttzbeADTD8/lyiGiBXA9hlI5rts0IUtIkOmFxJFztoaMnhfOGijS/h49TRfpUj/pR1uvGzoWrFsQHnezjowTXuczfdUE0JJAjbM7ajMsRHSVHh1PAbDuuaUVsuFk2jfJFFKN1f1ynN+bvs9YHtYsuZtfJrWH5CPpux3m7Op3pm0+J/9vXLKEaNZSjkNxeep0lbY1T4vSAx/mAJupjXU5dQ0THeKRZu67BDAMAlGHHYNeuXXaPcYqaUuRny5Ytdo8NHDjQ2iGNcUxlU9rTh50YWxzPqVWrlojkyF3XuCFD586d7Y7hDnBz585VfU8c9eEUuMwCER2giO3qM/+g02M12t3IEqd7OXZcc3SE5I5ecsc1I6SucS0Jp9Yxh6+kf9HI+6r4g3Cb2pjXny0raqw4wsRdYJJS0qxOohL8hfj7pfTUtZql3IvuccMAdpK55kbei8l5RCe/auoa79/Dnc54LLiqD3IFfyRTOkcLR4y7+fEeO3K3NVtEC+ug9DHFESneOHfTseviPcU1T0+Bc9YpkHXm1DUeA7zHkT9gh5ZxrDMCBsCyjw5S1wAAQD/g6ABFbB2b6gqNCDILXoGXV8iVnJcnndeSxI9xOXWtvJ9bS8u6yw0J5L2I3G0trVdEhwnLFUK9GpQRf3MER45oHHeSvsZRM66D4uOVGlOoRRNk50WObDiL6HAbaHYiOOrE0RBbdp39y1qfwx3HvIUdplm9YinakpLJtV+1S4dlqLGSUzZ3nb1FX1miOS/WKE7lnUQMi1g6BSanpq+WNawQQQUstTKZjZy6dhupa8YDER0AANAdODrAZeqalkYEviTasoLPP3LV2k/fuJcofhzzCj2vwnvSwjkzGhLITRL8mbomR2LeblrOzpGtamkD7qzzmlyfw3U0jm3G3em+dj8pxWVEh1t2yh3pHKM6ckMAb+pzHOFr8F3futStXin6W8fqirVTcp3O9zsviM1v+ZDBLdSjOQzvbxNqU0umVj+TGRTKY2lGYNlvBxixGQFqdAAAQC/g6ABFeI8QGXdX8PXiy5dr0o5RzRXrhOSWxBzROWNJW+NNHH2x6u/Lpg4y/ozodKtbisbVTqG+DdM7rcnI19VZ57WDlo5r7tbnyMj70cg4i+gwT6JLT3ThSN0eHRwdubvaxE41qFll+2JK2zod5neLo/d8dDGqEPlk41wl2GGSm2Sw093asmGqXyM6SF0zHtZmBIjoAACAXsDRAYrksxTSM57uWeJruBWvbVtppXoIrtF50ojA/2lrMnLqmgw7Yf6CC+0LKnS2ltPL3InouFufI1OvXHqdi22rbGdUlltM2zg67MDK9TkxHr6+t9QtU9BaZ5UezXGvHbQ8LrnOx7Y2ym81OkhdMxySpQuRBEcHAAB0A44OcJq6VrJgLr9vvOkMa+paQpK1PscIjQiUHB2OZniS9pVZVLGkrl29m0h3FVKcuBvbYUuNkbutpW07z9m2JpcdADUqW5yu4zapa3vP3xb/1y7tm/ocT+CdrGtZanfaVS9m7QznikqWqA93Z/Mnctc1bnGeYtlUFxgsopMNjg4AAOgFHB2gSDFLLYVSXYyRkH84/3k/iU7duG+Y1tKONTr+Tltz5YzIETOl/XTYgeQaG+7OVkHDtZXrXDi64MrRq1w0Xf6p6wmUxjussqNz7rYuaWvu8m6rStTmqaI0ul0Vt88Z2bYKzekVS6/ULUX+hBtP8LjjlMNHya531waZCDYMBQAA3cE3LFCE9/0I6hZkLSY3KuF5cojUKP5NvP9C+g/i8kaK6NikABqlQYISXKdz5c4jOh5/L4NDIdfncIcy2w1b3aVppUj6x09nRVc1V5QJzyMK+Xmvnyt3H4mNPfdYNwrVvn+ON3Cdjlyr4y7s1LX0Y22ODH9eP49o5m81gJOIjoSIDgAA6AYiOkC1Lub/Yopbi6qNCrc7lnVMsHT2KmugGh0zRHTsO68lqNbnaK2P4YgOdzeb0jnGrR/m5S0O0clr9+lGItnU53iWNgeAocE+OgAAoDtwdIDpket05E06XXX2ykzy5wo2iaNjqY1RSF07eFl2dLQ7GtzVzN2IFrewZk7euE+n7gZZ63OMWN8EgFaC5IhOdv/ssQQACHzKlStH3377LWVl4OgA0yO3mJYbESjth2KIiI6BU9dk5+LE9QTRfEAmKSXV2o0txsPW0lqRC/5PXL9Pp+8F+bU+BwDdSLPUTGEfHQAA0A04OsD0FLaJ6Bip41qGGh0DR3SiwvOIZgOJyWl0/s/0Nt1yKltyqiRqTrgDX2ZgjehcT6AzFkenvp/qcwDQjbT01DXU6AAAgH7A0QGmJ9KmjshIHdeYsNzpjk6e0OwUbmn1a9Rap0oWB8N2P53fLA0eYkoWyLRImazHqRsP6F5ykKgXq4n6HBBg7C/Smfo8HkGHC7XytyoAZC24y83jB9pvyQ+1n8uv7SazZs2i4sWLU1qa/dYA7du3p9dee43OnDkj/i5SpAjlzZuX6tatS5s2bfLoUvz555/UrVs3KlGiBOXOnZuio6Np8eLFdsfw60+aNIkqVKhAOXLkoDJlytCUKVOsz1++fFnIKFSoEOXJk4diY2Npz549ZBSwlARMTxGbmpxyBovocO1Ly6qRVKt0QUOl1ClRrVg+0XjgeHwCvVCDaNPR6zR5/XHxXL2ymZc6VrxATsqXI9jaXKJWqQKozwEBx42cZWhbmkRRuUr7WxUAshbsqHxaXHN0wKtlt/evEoW69zulS5cuNGjQINq6dSu1aNFCPPbXX3/RunXraO3atXT//n1q164dffLJJ8IBmT9/Pr344ot04sQJKl1a+XulT58+dP78edq2bZu4n5iYSHXq1KGRI0dS/vz56ccff6RXX32VypcvT/Xq1RPHjB49mmbPnk1ffvklPfPMM3TlyhX6/fffxXOsQ5MmTYSj9O9//5uKFi1K+/fvz+Cc+RM4OiDAIjrGcnRCsmejOb3rkhmoYtmskyM6i/ZcpA9XHxZtu5tVLkx9GpbJND3YIeSojhxNql8GaWsg8Eix1MIFc398AABwoGDBgtS2bVtatGiR1dFZvnw5RUREULNmzShbtmwUE/Okm+mECRNo1apVwuGIi4tTlFmsWDE7J4QdlGHDhlnvs2O1fv16+uGHH4Sjk5CQQNOnT6evv/6aevfuLY4pW7Ys1ahRQ/zNut28eZN+/fVXEdFhOPJjJODogICK6BitRsdMyLUxP5+6SZuP3xB/vxxbkj7tGK1p/xxvGxLIjk69ssbetBYALchNPzhtFACQiYTkTo+saICdhHsJCZQ/Xz7haGh6bQ/o0aMH9e/fn/7+97+LqM3ChQvplVdeEa/N0ZRx48aJKEx8fDylpKTQo0eP6OLFi6ryJk6caHc/NTWVPv30U+HYcKTm8ePHlJSUJNLYmGPHjon7sqPlCEd2atWqZXVyjAgcHWB6ykfmEXvpcLF/Ppvif+AZVSwtprn5ADO4RUV6t2VFv6TcyU5XcJBENUtq278HADNEdODoAJDJsE1zM30sAxwNCUlNP1+Lo+MhnIomSZJwZrgGZ/v27SKFjOFIzMaNG0W9DEdRcuXKRZ07dxbOirtMnjxZRGymTZsm6nO4xmbIkCFWGSzTGa6eNwJwdIDpyR0aTNtHNBNpYsC7VthPFc8vUtcmdKhOPepH+U2XRhXCKSR7EFUPS6McqM8BAUiqJX0EqWsAADVy5sxJnTp1EpGc06dPU+XKlal27driuR07doiam44dO4r7HOHh+htP2LFjh2ho0LNnT2vE6uTJk1StWjVxv2LFisKZ2bx5M73++usZzucUtjlz5ojaIaNGdfDLEAQEXKyOlVHvWdT/afppeDO/OjlMhch89POwxtS9vHEKGgHwJb2fjqK3q6VS+5raiqIBAFkDTl/jiM7cuXPF3zLshKxcuVKkjx08eJC6d+/usgnA6NGjqVevXnYyOCq0c+dOkab25ptv0vXr1+0cLW5UMGLECNHsgDu97d69m/71r3+J57nbGjcg6NChg3Cazp49SytWrKBdu3aRUYCjAwCwi+qUMsh+PxF5c1AogjkgQOHGKZULSBRlkPkGADAmzZs3F9ES7qbGzozMF198IRoWNGzYUKS4Pffcc9Zojxrx8fF2NTwffvihOIfPbdq0qdVpseWjjz6ioUOH0pgxY6hq1arCueEGBExoaCht2LCBIiMjRQc4Tn/77LPPKHt24xhvpK4BAAAAAABgQLjxwNWrGZsn8H42W7ZssXts4MCBdvfPnj1L9+492Rtv3rx5ds+zA7V69WqXr//BBx+Im7Uhg43MqKgo0Q3OqCCiAwAAAAAAAAg44OgAAAAAAAAAAg44OgAAAAAAAICAA44OAACAgOCbb74ReevcKah+/fq0d+9ep8cvW7aMqlSpIo7nItq1a9dmmq4AAAD0B44OAAAA07N06VJ67733aOzYsbR//36KiYkRnYRu3LiheDy3U+XuQf369aMDBw6ITkN8O3LkSKbrDgDQD3nTa954E5gLX3xmcHQAAACYHm612r9/f+rbt6/Y7G7mzJmUO3dusfeEErwbeJs2bWj48OGiZeqECRNEm9Wvv/4603UHAOhHcHB6g+GHDx/6WxXgIfJnFhISQpnaXprTAyZPnkzXrl0Tq2YzZsygevXqOU0P4D7cvGMrb070+eefi37bAAAAgLc8fvyYfvvtN7EZnm1L1JYtW6puXMePcwTIFo4AuWq1CgAwF7ynS1hYmDW6ywsgcpTHU7i1Mn/fJCYmiu8YX2EmuWk66eoYyWEnhz8z/uy82ZcnWGt6AK+WcQ70tGnThHHgjYx4wyC19ICJEyfSCy+8QIsWLRLpAZxaUL16dc2KAwAAAMytW7coNTWVihQpYvc43z9+/LjiObxQp3Q8P65EUlKSuMnI+0gkJyeLm6fI52g5N1DkmklXveSaSVe95GaGruHh4eI74vr1617/AOcf+FzXp9VZMrtcSSddlcifP7/47JTGhrvjJdib9ACGHZ4ff/xRpAeMGjXKaXoAw+kBGzduFOkBfC4AAABgdHixbvz48Rke513BeYVYK2wP9cBMcs2kq15yzaSrXnIzQ1f+Ye5NdABkHuyYOqvRcTcV0SNHB+kBAAAAjEZERIT48eK4Wsv3ixYtqngOP+7J8Wz3bG0ZR3RKlSpFrVu3FquOnsKrkfwDrFWrVl7ln5tZrpl01UuumXTVSy50NZfcZJ109RQ5qu5TRycz0gPMkiJgprCwXnLNpKtecqGrueSaSVc95WrRwciEhoZSnTp1aPPmzSI1Ws4j5/txcXGK5zRo0EA8P2TIEOtjbLz5cSVy5Mghbo6woffG2Ht7fiDINZOuesk1k656yYWu5pIbopOunry+bs0I9MZMKQJmCgvrJddMuuolF7qaS66ZdNVTrjuYpVMRR1t69+5NsbGxojkO148+ePDAmmbdq1cvKlGihLAvzDvvvENNmjShqVOn0vPPP09Lliyhffv20axZs/z8TgAAAPiKYKOlB5glRcBMYUa95JpJV73kQldzyTWTrnrK1SM9wN907dqVbt68SWPGjBEZAzVr1qR169ZZMwouXrxo1yGoYcOGojnOhx9+SO+//77oCMop1WiSAwAAWdTRyYz0AKUUAbkY6dGjR5qMPf9Y4FVJPj8lJcXj8zNLptnkmklXveRCV3PJNZOuesr1BH5ts2y2x3ZIzRZt27Ytw2NdunQRNy3I10OrIyh/tny+r51js8g1k656yTWTrnrJha7mkpusk66eIn/3urRNkocsWbJEypEjhzRv3jzp6NGj0htvvCGFhYVJ165dE8+/+uqr0qhRo6zH79ixQwoODpamTJkiHTt2TBo7dqwUEhIiHT582O3XvHTpEr8L3HDDDTfc/HTj72HwBNgl3HDDDTcyvG0KNkN6QPHixenSpUuUL18+TT275dQ3lqEl9S2zZJpNrpl01UsudDWXXDPpqqdcT+DVsoSEBPE9DIxtl8wm10y66iXXTLrqJRe6mkvuPQPYJU9sU7DR0wMYdpxKlixJ3sIfiK8/FD1kmk2umXTVSy50NZdcM+mqp1x3KVCggN9e26gY2S6ZTa6ZdNVLrpl01UsudDWX3Px+tkvu2qYnoRcAAAAAAAAACBDg6AAAAAAAAAACjizh6HAHt7Fjxypu9mYkmWaTayZd9ZILXc0l10y66ikX+B+zjRnMR1wDveRCV3PJzWEyuxTEHQn8rQQAAAAAAAAA+JIsEdEBAAAAAAAAZC3g6AAAAAAAAAACDjg6AAAAAAAAgIAjSzk6vKkbb1ZqdJlKnD9/XrzW77//bmiZ8l5KLPfOnTuGl2sWmXrKNotMPeWaaY7peQ2AfzCrbdLLhsA2mUem2eSaSVezzbFtBrVNAefofPPNN1SmTBnKmTMn1a9fn/bu3euVvHHjxokPzvZWpUoVj+X8/PPP9OKLL4odXJUMEPeEGDNmDBUrVoxy5cpFLVu2pFOnTnkls0+fPhl0b9OmjVOZEydOpLp164rdviMjI6lDhw504sQJu2MSExNp4MCBFB4eTnnz5qWXXnqJrl+/7rXcpk2bZtB3wIABTuV+++23VKNGDevGVQ0aNKD//e9/XunqSqYWPZX47LPPxLlDhgzxSl9XMrXo62rca9XTlVxvru2VK1eoZ8+eQieeQ9HR0bRv3z6v5pgrmVrmGH8/OZ7DN76evhgDwJgY0TbpYZfckQvbZFzbpIddysq2SQ+75I5c2KYAdXSWLl1K7733nmh7t3//foqJiaHnnnuObty44ZXcp556iuLj4623X375xWMZDx48EPqwsVNi0qRJ9NVXX9HMmTNpz549lCdPHqE7DyytMhke2La6L1682KmeP/30kxjIu3fvpo0bN1JycjK1bt1avJbMu+++S//5z39o2bJl4virV69Sp06dvJbL9O/f305fvi7O4J3J+Qv0t99+E5O8efPm1L59e/rjjz806+pKphY9Hfn111/pH//4hzBatmjR15VMrfo6G/fe6OlqPmnR9fbt29SoUSMKCQkRhv/o0aM0depUKliwoOY55o5MLXOMPyfb43k+MF26dPH62gJjYlTbpIddckcuA9tkPNukh11yJjfQbZMedslduQxskwUpgKhXr540cOBA6/3U1FSpePHi0sSJE8V9frurVq2yPj9mzBipaNGi0sGDB1Vljh07VoqJiVF9XotMx3PS0tLEOZMnT7Y+dufOHSlHjhzS4sWLxf1z586J8w4cOCDup6SkSH379pUqV64sXbhwIYNMpnfv3lL79u1V9XAlk7lx44Y45qeffrLqFRISIi1btswq59ixY+KYXbt2iftbt24V92/fvi3uP3jwQGrTpo3UsGFD62OOcpkmTZpI77zzjqq+7shlChYsKM2ZM8dnutrK9IWeCQkJUsWKFaWNGzfayfJG3/r160vly5fPIFOrviwrd+7cdtdAxhs9S5YsKVWvXl1VF63XtkSJEtLTTz+tep6WOTZ8+HCpSJEidvPBEV/MMX6/fL1ZR1+OWWAczGCb9LBLSnIZ2Cbj2aZLly753C45k5sVbFPZsmWlfPnyqX4va51j0dHRUq5cuVTtEgPb9ISAieg8fvxYrHJw2E8mW7Zs4v6uXbvsjuXv3kGDBtH8+fNp+/btiqsMtnAYkUPw5cqVox49etDFixczHOOp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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 25
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 评估",
   "id": "5c9b9504fe3df138"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-16T10:53:41.489842Z",
     "start_time": "2025-01-16T10:53:40.477613Z"
    }
   },
   "cell_type": "code",
   "source": [
    "model.eval()  # 评估模式\n",
    "# 验证集评估\n",
    "val_loss, val_acc = evaluate(model, val_loader, loss_fct)\n",
    "print(f\"val_loss: {val_loss:.4f}, val_acc: {val_acc:.4f}\")"
   ],
   "id": "4cae37f2d9e3a7b8",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "val_loss: 0.3181, val_acc: 0.8880\n"
     ]
    }
   ],
   "execution_count": 26
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
